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

C# 如何在ASP.NET MVC Web应用程序中使用Ninject?,c#,asp.net-mvc,dependency-injection,ninject,C#,Asp.net Mvc,Dependency Injection,Ninject,我已经创建了一个新的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) {

我已经创建了一个新的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);
        }
    }
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)
        {
        }        
    }
应用程序\u启动\n项目网络命令:

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);
        }
    }
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)
        {
        }        
    }
公共静态类NinjectWebCommon
{
私有静态只读引导程序Bootstrapper=new Bootstrapper();
/// 
///启动应用程序
/// 
公共静态void Start()
{
RegisterModule(typeof(OnePerRequestHttpModule));
RegisterModule(typeof(NinjectHttpModule));
初始化(CreateKernel);
}
/// 
///停止应用程序。
/// 
公共静态无效停止()
{
bootstrapper.ShutDown();
}
/// 
///创建将管理应用程序的内核。
/// 
///创建的内核。
私有静态IKernel CreateKernel()
{
var kernel=新的标准内核();
kernel.Bind().ToMethod(ctx=>()=>newbootstrapper().kernel);
kernel.Bind().To();
注册服务(内核);
返回内核;
}
/// 
///在这里加载您的模块或注册您的服务!
/// 
///内核。
私有静态无效注册服务(IKernel内核)
{
}        
}
我得到错误“序列不包含元素”。我做错了什么

错误详细信息:

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
Description:执行当前web请求期间发生未处理的异常。检查堆栈跟踪以了解有关此错误的更多信息以及它在代码中的起源。
异常详细信息:System.InvalidOperationException:序列不包含任何元素
源错误:
执行当前web请求期间发生未处理的异常。有关异常的起源和位置的信息可以使用下面的异常堆栈跟踪来识别。
堆栈跟踪:
[无效操作例外情况:ПСааааааааааааа
系统。Linq。可枚举。单个(IEnumerable`1源)+320
c:\Projects\Ninject\Ninject.Web.Mvc\mvc3\src\Ninject.Web.Mvc\Ninject\ninjectmvchttpplicationplugin.Start()中的Ninject.Web.Mvc.ninjectmvchttpplicationplugin.Start()
c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Common\Bootstrapper.cs中的Ninject.Web.Common.Bootstrapper.b_u0(InInInInjectHttpApplication插件c):52
c:\Projects\Ninject\Ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.Map(IEnumerable`1系列,Action`1 Action)中的Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1系列,Action`1 Action)
c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Common\Bootstrapper.cs:52中的Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback)
c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Ninject.Common\NinjectHttpApplication.cs:80中的Ninject.Web.Common.NinjectHttpApplication.Application_Start()

您正从
NinjectHttpApplication
派生,同时使用
App\u Start
。选择一个!阅读以了解更多信息。

要明确了解这一点,如果使用NuGet添加“Ninject.Mvc3”包(我使用的是3.0.0.6版),则无需对
global.asax.cs
进行任何修改。NuGet软件包通过在MVC4项目的
App_Start
文件夹中创建
NinjectWebCommon
类为您发挥了神奇的作用


我之所以这样说,是因为我似乎遵循了与原始海报类似的教程(我遵循了一篇关于代码项目的文章,名为“”),并且与原始海报的问题完全相同。代码项目文章没有明确说明您应该使用NuGet(并且不要触摸global.asax.cs或者手动添加Ninject引用(并修改global.asax.cs)。

确保您没有引用同样使用NinjectMVC3应用程序的项目。
删除对这些的引用后,我的项目开始工作。此外,如前所述,检查名称空间是否匹配且正确。

您可以添加完整的stacktrace吗?似乎正在尝试从MVC中删除。您是否使用正确的MVC版本/您是否以某种方式对其进行了配置?啊,整洁-因此他看到错误的原因是关于删除DataAnnotationsModelValidatorProvider的问题是,他第二次初始化Ninject,而第一次初始化已经删除了它?我想这是一个有用的捕获,但可能会失败更多gracefully@RemoGloor-我不得不说,这两种不同的方法对于初学者来说是令人难以置信的困惑,即使是文档e文档确实在本质上说“它们完全相同”,但看看代码,Nuget方法有一个空的“RegisterServices”方法,而NinjectHttpApplication方法有“kernal.Load(Assembly.GetExecutionGassemby)”’。这些不一样,如果您能在该文档页面上提供更多指导,我们将不胜感激。这是人们可能在Ninject上找到的第一页,如果您能提供更多详细信息,我们将不胜感激beginneres@Simon_Weaver将RegisterServices方法添加到NinjectHttpApplication方法中,以具有相同的regis实现更新代码。现在它实际上是一样的。如果你需要更多信息,他们会添加你认为缺少的TODO,或者如果你知道答案,自己添加。我想看一个通过NinjectWebCommon类创建的访问内核的示例。我有一个自定义控制器工厂,在尝试确定在哪里可以访问它时遇到问题内核的实例。这正是我的问题。谢谢你的提示!