2014-10-29 9 views
5

Diese Frage ist nicht neu, aber mein Problem scheint eine andere Wurzel zu haben als die, die ich bisher gesehen habe.Ninject.MVC3. Bootstrapper.Initialize Würfe "Sequenz enthält keine Elemente"

Ich habe eine Lösung mit mehreren Projekten: zwei von ihnen sind C# MVC4. Ich installierte Ninject.MVC3 Nuget Paket auf beiden und ich benutze die NinjectWebCommon Klasse in App_Start Ordner Ansatz (https://github.com/ninject/Ninject.Web.Mvc/wiki/Setting-up-an-MVC3-application).

Versionen:

  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 des ersten Projekts:

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 des zweiten Projekts:

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); 
     }   
    } 
} 

Hier ist die Datei global.asax des ersten Projekts:

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(); 
     } 
    } 
} 

und des zweiten:

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(); 
     } 
    } 
} 

Wenn ich versuche, einen der beiden Profi zu laufen jekte, erhalte ich eine InvalidOperationException sagen „Sequenz keine Elemente enthält“, wenn

bootstrapper.Initialize(CreateKernel); 

Stacktrace Aufruf:

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 

Einige Leute hatten dieses Problem, wenn sie machen global.asax von NinjectHttpApplication ableiten und nutzen auch NinjectWebCommon Klasse oder beim Umbenennen von Assemblys (Ninject + MVC3 = InvalidOperationException: Sequence contains no elements). Das ist nicht mein Fall.

Andere Typen haben diesen Fehler, wenn zwei Projekte in der gleichen Lösung WebActivator verwenden, um Ninject zu initialisieren (Ninject for Web Site and Api - Sequence contains no elements). Also habe ich versucht, eines der Projekte zu entladen, aber immer noch den Fehler erhalten.

Irgendwelche Ideen, was vor sich geht?

+0

Können Sie auch innerhalb Ninject die genauen Methode veröffentlichen diese Ausnahme auslöst (man könnte auch haben um auch die innexceptions zu überprüfen)? – nemesv

+0

Ich habe den Stacktrace der Ausnahme hinzugefügt. Es gibt keine innere Ausnahme. Vielen Dank – peflorencio

Antwort

8

In der Tat gab es ein anderes Projekt, das WebActivator in der Lösung verwendete: eine Klassenbibliothek, die von einem der MVC-Projekte referenziert wurde. Ich habe es nicht vermutet, weil es keinen Sinn macht, WebActivator da drin zu haben.

0

Ich habe die "Sequenz enthält keine Elemente" aufgrund meiner Referenzen erlebt. Bitte überprüfen Sie Ihre Referenzen. Wenn es einen Verweis auf ein anderes Projekt gibt, das Ninject Infrastructure-Verzeichnis enthält, verursacht auch der Fehler. Wenn Sie es löschen, kann das Problem gelöst werden.

1

Dieser Fehler tritt auch auf, wenn es sind Exists 2 Code-Dateien Referenzen + NinjectWebCommon.cs (normalerweise in App_Start-Ordner) in der Lösung.

Wenn es mehr Initialize() Methode gibt es auch dies führt Fehler ähnlich wie „Sequenz keine Elemente enthalten

Verwandte Themen