如何在 ASP.NET MVC Web 应用程序中使用 Ninject?

How do I work with Ninject in an ASP.NET MVC Web App?

提问人:Mediator 提问时间:4/25/2012 最后编辑:Duncan AwerbuckMediator 更新时间:11/14/2013 访问量:28317

问:

我创建了一个新的 MVC Web 应用程序,并引用了 Ninject.dll、Ninject.Web.Common.dll 和 Ninject.Web.MVC.dll。

Global.asax.cs:

public class MvcApplication : NinjectHttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new
                {
                    controller = "Home",
                    action = "Index",
                    id = UrlParameter.Optional
                });
        }

        protected override IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Load(Assembly.GetExecutingAssembly());
            return kernel;
        }

        protected override void OnApplicationStarted()
        {
            base.OnApplicationStarted();

            AreaRegistration.RegisterAllAreas();
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }

App_start\NinjectWebCommon:

public static class NinjectWebCommon 
    {
        private static readonly Bootstrapper bootstrapper = new Bootstrapper();

        /// <summary>
        /// Starts the application
        /// </summary>
        public static void Start() 
        {
            DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
            DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
            bootstrapper.Initialize(CreateKernel);
        }

        /// <summary>
        /// Stops the application.
        /// </summary>
        public static void Stop()
        {
            bootstrapper.ShutDown();
        }

        /// <summary>
        /// Creates the kernel that will manage your application.
        /// </summary>
        /// <returns>The created kernel.</returns>
        private static IKernel CreateKernel()
        {
            var kernel = new StandardKernel();
            kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
            kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

            RegisterServices(kernel);
            return kernel;
        }

        /// <summary>
        /// Load your modules or register your services here!
        /// </summary>
        /// <param name="kernel">The kernel.</param>
        private static void RegisterServices(IKernel kernel)
        {
        }        
    }

我收到错误“序列不包含任何元素”。我做错了什么?

错误详细信息:

Description: An unhandled exception occurred during the execution of the current web request. Examine the stack trace for more information about this error and where it originated in the code.

Exception Details: System.InvalidOperationException: Sequence contains no elements

Source Error:
  Unhandled exception occurred during execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.


Stack Trace:

[InvalidOperationException: Последовательность не содержит элементов]
   System.Linq.Enumerable.Single(IEnumerable`1 source) +320
   Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectMvcHttpApplicationPlugin.cs:53
   Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52
   Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:32
   Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52
   Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:80
C# ASP.NET-MVC 依赖注入 ninject

评论

0赞 Remo Gloor 4/25/2012
你能添加完整的堆栈跟踪吗?
0赞 Rup 4/25/2012
第 53 行似乎试图从 MVC 中删除 DataAnnotationsModelValidatorProvider。您是否使用了正确版本的 MVC/您是否以某种方式自己配置了它?

答:

24赞 Remo Gloor 4/25/2012 #1

你派生自 AND 你同时使用。选择一个!有关详细信息,请阅读 Ninject.MVC3 的文档NinjectHttpApplicationApp_Start

评论

0赞 Rup 4/25/2012
啊,整洁 - 所以他看到有关删除 DataAnnotationsModelValidatorProvider 的错误的原因是他第二次初始化 Ninject 并且第一个 init 已经删除了它?我想这是一个有用的捕获,但它可能会更优雅地失败
5赞 Simon_Weaver 12/14/2012
@Remo Gloor - 我不得不说,即使有文档,这两种不同的方法对于初学者来说也非常令人困惑。文档确实基本上说“它们完全相同”,但从代码来看,Nuget 方式有一个空的“RegisterServices”方法,而 NinjectHttpApplication 方式有一个“kernal”。Load(Assembly.GetExecutingAssemby)'。这些是不一样的,非常感谢该文档页面上的更多指导。这是人们可能在 Ninject 上找到的第一页之一,对于初学者来说,更多细节会很棒
0赞 Remo Gloor 12/17/2012
@Simon_Weaver 将 RegisterServices 方法添加到 NinjectHttpApplication 方式中,以具有相同的注册代码实现。现在真的是一样的。如果您需要更多信息,他们会添加您认为缺少的 TODO,或者如果您知道答案,请自行添加。
2赞 Stephen Price 4/10/2016
我想看一个访问通过NinjectWebCommon类创建的内核的示例。我有一个自定义控制器工厂,并且在尝试确定我可以从哪里访问此内核实例时遇到问题。
40赞 Duncan Awerbuck 8/29/2012 #2

为了明确这一点,如果您使用 NuGet 添加“Ninject.Mvc3”包(我使用的是版本 3.0.0.6),则无需对 .NuGet 包通过在 MVC 4 项目的文件夹中创建类来为你发挥魔力。global.asax.csNinjectWebCommonApp_Start

我之所以这样说,是因为我似乎遵循了与原始海报类似的教程(我遵循了代码项目上的一篇名为“使用 Ninject 在 asp.net mvc4 和 webapi 中的依赖注入”的文章),并且遇到了与原始海报完全相同的问题。代码项目一文没有明确指出应该使用 NuGet(并且不要手动触摸添加 Ninject 引用(并修改)。global.asax.csglobal.asax.cs

7赞 dwbrito 9/5/2012 #3

确保您没有引用也使用 . 删除对此类的引用后,我的项目开始工作。此外,如前所述,检查命名空间是否全部匹配且正确。NinjectMVC3 App_Start

评论

0赞 code5 5/11/2014
这就是我的问题。谢谢你的提示!