Ninject.MVC3。 Bootstrapper.Initialize throws“Sequence contains no elements”

时间:2014-10-29 13:50:48

标签: c# asp.net-mvc-4 ninject ninject.web.mvc

这个问题并不新鲜,但我的问题似乎与我目前看到的问题有所不同。

我有一个包含几个项目的解决方案:其中两个是C#MVC4。我在两者上安装了Ninject.MVC3 Nuget包,我在App_Start文件夹方法(https://github.com/ninject/Ninject.Web.Mvc/wiki/Setting-up-an-MVC3-application)中使用了NinjectWebCommon类。

版本:

  1. Ninject 3.2.2.0
  2. Ninject.MVC3 3.2.1.0
  3. Ninject.Web.Common 3.2.3.0
  4. Ninject.Web.Common.WebHost 3.2.3.0
  5. WebActivator 2.0.5
  6. 第一个项目的NinjectWebCommon.cs:

    using System.Web.Mvc;
    using Ninject.Web.Mvc.FilterBindingSyntax;
    using S1.MVC.Filters.CentralAutenticacao.Business;
    using S1.MVC.Filters.Error;
    
    [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(S1.CRM.Eventos.App_Start.NinjectWebCommon), "Start")]
    [assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(S1.CRM.Eventos.App_Start.NinjectWebCommon), "Stop")]
    
    namespace S1.CRM.Eventos.App_Start
    {
        using System;
        using System.Web;
    
        using Microsoft.Web.Infrastructure.DynamicModuleHelper;
    
        using Ninject;
        using Ninject.Web.Common;
    
        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();
                try
                {
                    kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                    kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
    
                    RegisterServices(kernel);
                    return kernel;
                }
                catch
                {
                    kernel.Dispose();
                    throw;
                }
            }
    
            /// <summary>
            /// Load your modules or register your services here!
            /// </summary>
            /// <param name="kernel">The kernel.</param>
            private static void RegisterServices(IKernel kernel)
            {
                kernel.BindFilter<FiltroCentralAutenticacao>(FilterScope.Global, 0);
                kernel.BindFilter<GenericErro>(FilterScope.Global, 0);
            }        
        }
    }
    

    第二个项目的NinjectWebCommon.cs:

    using System.Web.Mvc;
    using Ninject.Web.Mvc.FilterBindingSyntax;
    using S1.MVC.Filters.CentralAutenticacao.Business;
    using S1.MVC.Filters.Error;
    
    [assembly: WebActivatorEx.PreApplicationStartMethod(typeof(S1.CRM.Crud.App_Start.NinjectWebCommon), "Start")]
    [assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(S1.CRM.Crud.App_Start.NinjectWebCommon), "Stop")]
    
    namespace S1.CRM.Crud.App_Start
    {
        using System;
        using System.Web;
    
        using Microsoft.Web.Infrastructure.DynamicModuleHelper;
    
        using Ninject;
        using Ninject.Web.Common;
    
        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();
                try
                {
                    kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
                    kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();
    
                    RegisterServices(kernel);
                    return kernel;
                }
                catch
                {
                    kernel.Dispose();
                    throw;
                }
            }
    
            /// <summary>
            /// Load your modules or register your services here!
            /// </summary>
            /// <param name="kernel">The kernel.</param>
            private static void RegisterServices(IKernel kernel)
            {
                kernel.BindFilter<FiltroCentralAutenticacao>(FilterScope.Global, 0);
                kernel.BindFilter<GenericErro>(FilterScope.Global, 0);
            }        
        }
    }
    

    这是第一个项目的global.asax文件:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    using System.Web.Http;
    using System.Web.Mvc;
    using System.Web.Optimization;
    using System.Web.Routing;
    
    namespace S1.CRM.Eventos
    {
        // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
        // visit http://go.microsoft.com/?LinkId=9394801
    
        public class MvcApplication : HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                AuthConfig.RegisterAuth();
            }
        }
    }
    

    和第二个:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Http;
    using System.Web.Mvc;
    using System.Web.Optimization;
    using System.Web.Routing;
    
    namespace S1.CRM.Crud
    {
        // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
        // visit http://go.microsoft.com/?LinkId=9394801
    
        public class MvcApplication : HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
    
                WebApiConfig.Register(GlobalConfiguration.Configuration);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
                AuthConfig.RegisterAuth();
            }
        }
    }
    

    当我尝试运行这两个项目中的任何一个时,我得到一个InvalidOperationException,说&#34; Sequence不包含任何元素&#34;在打电话时

    bootstrapper.Initialize(CreateKernel);
    

    堆栈跟踪:

    in System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
    in Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start()
    in Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c)
    in Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map[T](IEnumerable`1 series, Action`1 action)
    in Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback)
    in S1.CRM.Eventos.App_Start.NinjectWebCommon.Start() in d:\git-paulo\S1.CRM\S1.CRM.Eventos\App_Start\NinjectWebCommon.cs:line 30
    

    有些人在使用Global.asax派生自NinjectHttpApplication并使用NinjectWebCommon类或重命名程序集(Ninject + MVC3 = InvalidOperationException: Sequence contains no elements)时遇到此问题。那不是我的情况。

    当使用WebActivator初始化Ninject(Ninject for Web Site and Api - Sequence contains no elements)的同一解决方案中的两个项目时,其他人遇到此错误。所以我试图卸载其中一个项目,但仍然不断收到错误。

    有关正在发生的事情的任何想法?

4 个答案:

答案 0 :(得分:8)

确实在解决方案中还有另一个使用WebActivator的项目:一个MVC项目引用的类库。我没有怀疑它,因为在那里安装WebActivator没有任何意义。

答案 1 :(得分:1)

  

如果存在存在2个代码文件引用,也会发生此错误   解决方案中的+ NinjectWebCommon.cs (通常位于App_Start文件夹中)。

     

如果存在多个Initialize()方法,这也会导致错误   类似于“序列不包含元素

答案 2 :(得分:0)

由于我的参考,我经历过“序列不包含元素”。请检查您的参考。如果存在对包含Ninject Infrastructure目录的另一个项目的引用也会导致错误。如果你删除它可能会解决问题。

答案 3 :(得分:0)

这也发生在我身上,原因不同 - 我有两个Bootstrapper实例,每个实例都尝试初始化一个Ninject内核。

也就是说,我在两个地方都有典型的NinjectWebCommon代码,因为当我更新Ninject(使用nuget)时,更新过程在默认位置插入了一个新的代码文件。最初我在其他地方移动了典型的NinjectWebCommon代码。