Ninject.MVC3. Загрузчик.Последовательность "инициализировать броски" не содержит элементов"

у меня есть решение, содержащее несколько проектов: два из них-C# MVC4. Я установил Ninject.Пакет MVC3 Nuget на обоих, и я использую класс NinjectWebCommon в подходе к папке App_Start(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.Сеть.Общие 3.2.3.0
  4. Ninject.Сеть.Общий.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);
        }        
    }
}

вот глобальный.файл 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);

Stacktrace:

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-pauloS1.CRMS1.CRM.EventosApp_StartNinjectWebCommon.cs:line 30

некоторые люди имели эту проблему, когда они делают глобальный.asax являются производными от NinjectHttpApplication, а также используют класс NinjectWebCommon или при переименовании сборок (Ninject + MVC3 = InvalidOperationException: последовательность не содержит элементов). Это не мое дело.

другой парень получил эту ошибку, когда два проекты в том же решении, где с помощью WebActivator инициализировать Ninject (Ninject для веб-сайта и Api-последовательности не содержит элементов). Поэтому я попытался выгрузить один из проектов, но все равно продолжал получать ошибку.

любые идеи о том, что происходит?

4 ответов


действительно, в решении был еще один проект с использованием WebActivator: библиотека классов, на которую ссылается один из проектов MVC. Я не подозревал об этом, потому что нет никакого смысла иметь там WebActivator.


эта ошибка также возникает, если есть существует 2 файла кода ссылки +NinjectWebCommon.cs (обычно находится в папке App_Start) в решении.

Если существует несколько методов Initialize (), это также приводит к ошибке похожие на "последовательность не содержит элементов"


Я испытал "последовательность не содержит элементов" из-за моей ссылки. Пожалуйста, проверьте свои рекомендации. Если есть ссылка на другой проект, который содержит каталог инфраструктуры Ninject также вызывает ошибку. Если вы удалите его проблема может быть решена.


Это также произошло со мной по другой причине - у меня было два экземпляра загрузчика, каждый из которых пытался инициализировать ядро Ninject.

то есть у меня был типичный код NinjectWebCommon в двух местах, потому что, когда я обновил Ninject (с nuget), процесс обновления вставил новый файл кода в место по умолчанию. Первоначально я переместил типичный код NinjectWebCommon в другое место.