2012-04-25 13 views
24

Stworzyłem nową aplikację sieci Web MVC i mam odniesienia do Ninject.dll, Ninject.Web.Common.dll i Ninject.Web.MVC.dll.Jak pracować z programem Ninject w aplikacji sieci Web ASP.NET MVC?

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

App_start \ NinjectWebCommon:

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

pojawia się błąd "sekwencja zawiera żadnych elementów". Co ja robię źle?

Szczegóły błędu:

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 
+0

można dodać pełny stackTrace? –

+0

zaktualizować mój post – Mediator

+0

[Linia 53] (https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/N injectMvcHttpApplicationPlugin.cs # L53) wydaje się próbować usunąć [DataAnnotationsModelValidatorProvider] (http://msdn.microsoft.com/en-us/library/system.web.mvc.dataannotationsmodelvalidatorprovider.aspx) z MVC. Czy używasz odpowiedniej wersji MVC/czy sam ją skonfigurowałeś w jakiś sposób? – Rup

Odpowiedz

24

Jesteś wynikające z NinjectHttpApplication a używasz App_Start w tym samym czasie. Wybierz jeden! Przeczytaj docu of Ninject.MVC3, aby uzyskać więcej informacji.

+0

Ah, schludny - więc powodem, dla którego widzi błąd związany z usuwaniem DataAnnotationsModelValidatorProvider, jest to, że Inicjowanie Ninject po raz drugi i pierwszy init już go usunął? Domyślam się, że jest to przydatny haczyk, ale prawdopodobnie powinien zakończyć się niepowodzeniem z większym wdziękiem. – Rup

+5

@Remo Gloor - Muszę powiedzieć, że te dwa różne podejścia są niesamowicie kłopotliwe dla początkujących, nawet jeśli chodzi o dokumentację. Dokumentacja rzeczywiście zasadniczo mówi "są one dokładnie takie same", ale patrząc na kod, metoda Nuget ma pustą metodę "RegisterServices", a metoda NinjectHttpApplication ma "kernal.Load (Assembly.GetExecutingAssemby)". To nie jest to samo, a wiele wskazówek na tej stronie dokumentacji byłoby bardzo cenne. Jest to jedna z pierwszych stron, które ludzie mogą znaleźć na Ninject, a trochę więcej szczegółów byłoby świetne dla początkujących. –

+0

@Simon_Weaver Dodano metodę RegisterServices do metody NinjectHttpApplication, aby uzyskać taką samą implementację kodu rejestracyjnego. Teraz jest naprawdę taki sam. Jeśli potrzebujesz więcej informacji, dodaj TODO, czego brakuje w Twojej opinii, lub dodaj to sam, jeśli znasz odpowiedź. –

39

zostać wyraźnie jasne, o to, czy używasz Nuget dodać pakietu „Ninject.Mvc3” (użyłem wersji 3.0.0.6), tam ma potrzeby dokonywać żadnych modyfikacji do global.asax.cs. Pakiet NuGet robi dla Ciebie magię, tworząc klasę NinjectWebCommon w folderze App_Start w projekcie MVC 4.

Mówię to, ponieważ wydaje mi się, że podążałem podobnym samouczkiem do oryginalnego plakatu (śledziłem artykuł na temat Projektu kodowego pod tytułem "Dependency Injection in asp.net mvc4 and webapi using Ninject') i miałem dokładnie ten sam problem co oryginalny plakat. W artykule kod projektu nie było jasne, że należy albo użycie Nuget (i nie dotykać global.asax.cslub dodać referencje Ninject ręcznie (i zmianę global.asax.cs).

7

Bądź pewien, że nie są odwoływania się projekt, który również używa NinjectMVC3 App_Start. Po usunięciu odniesienia do takich, mój projekt rozpoczął pracę. ponadto, jak wspomniano wcześniej, sprawdź przestrzeni nazw cały mecz i są poprawne.

+0

To był mój dokładny problem. Dzięki za podpowiedź! – code5

Powiązane problemy