【问题标题】:Ninject.MVC3. Bootstrapper.Initialize throws "Sequence contains no elements"忍者.MVC3。 Bootstrapper.Initialize 抛出“序列不包含任何元素”
【发布时间】:2014-12-25 06:15:54
【问题描述】:

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

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

版本:

  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

第一个项目的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 提示“序列不包含任何元素”

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) 时,其他人收到此错误。所以我尝试卸载其中一个项目,但仍然不断收到错误。

有什么想法吗?

【问题讨论】:

  • 您能否也发布一下 Ninject 中哪个确切方法引发了此异常(您可能还需要检查内部异常)?
  • 我添加了异常的堆栈跟踪。没有内在的例外。谢谢

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-04
          • 2015-02-19
          • 1970-01-01
          • 2016-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多