2012-04-25 6 views
24

Ho creato una nuova applicazione MVC Web e ho riferimenti a Ninject.dll, Ninject.Web.Common.dll e Ninject.Web.MVC.dll.Come lavoro con Ninject in un'applicazione Web ASPC di MVCNET?

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

ottengo l'errore "La sequenza non contiene elementi". Che cosa sto facendo di sbagliato?

Dettagli errore:

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

è possibile aggiungere il pieno stacktrace? –

+0

posso aggiornare il mio post – Mediator

+0

[Riga 53] (https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/N injectMvcHttpApplicationPlugin.cs # L53) sembra provare a rimuovere [DataAnnotationsModelValidatorProvider] (http://msdn.microsoft.com/en-us/library/system.web.mvc.dataannotationsmodelvalidatorprovider.aspx) da MVC. Stai utilizzando la versione corretta di MVC/hai configurato tu stesso in qualche modo? – Rup

risposta

24

Stai derivanti da NinjectHttpApplication e si utilizza App_Start allo stesso tempo. Scegline uno! Leggi il docu of Ninject.MVC3 per maggiori informazioni.

+0

Ah, pulito - quindi il motivo per cui sta vedendo l'errore relativo alla rimozione di DataAnnotationsModelValidatorProvider è che sta inizializzando Ninject la seconda volta e che il primo init lo ha già rimosso? Immagino che sia una cattura utile ma probabilmente dovrebbe fallire con più grazia – Rup

+5

@Remo Gloor - Devo dire che questi due approcci diversi sono incredibilmente confusi per il principiante, anche con la documentazione. La documentazione dice in sostanza che "sono esattamente uguali", ma guardando il codice il modo Nuget ha un metodo "RegisterServices" vuoto e il modo NinjectHttpApplication ha "kernal.Load (Assembly.GetExecutingAssemby)". Questi non sono gli stessi e molte indicazioni su quella pagina di documentazione sarebbero molto apprezzate. Questa è una delle prime pagine che è probabile che le persone trovino su Ninject e un po 'più di dettaglio sarebbe ottimo per i principianti –

+0

@Simon_Weaver Aggiunto il metodo RegisterServices nel modo NinjectHttpApplication per avere la stessa implementazione del codice di registrazione. Ora è davvero lo stesso. Se hai bisogno di maggiori informazioni, aggiungi TODO ciò che manca nella tua opinione o aggiungilo tu stesso se conosci la risposta. –

39

essere esplicitamente chiari su questo, se si utilizza NuGet per aggiungere il pacchetto 'Ninject.Mvc3' (io ho usato la versione 3.0.0.6), non vi è alcuna necessità di apportare modifiche-global.asax.cs. Il pacchetto NuGet fa la magia per te creando la classe NinjectWebCommon nella cartella App_Start del tuo progetto MVC 4.

Dico questo perché mi sembra di aver seguito un tutorial simile al poster originale (ho seguito un articolo su The Code Project chiamato "Dependency Injection in asp.net mvc4 and webapi using Ninject'), e ho avuto esattamente lo stesso problema del poster originale. L'articolo codice Project non mettere in chiaro che si dovrebbe sia uso NuGet (e non toccare global.asax.cso aggiungere i riferimenti Ninject manualmente (e modificare global.asax.cs).

7

Essere sicuri che non fa riferimento a progetto che utilizza anche il NinjectMVC3 App_Start. Dopo aver rimosso il riferimento a tale, il mio progetto ha iniziato a lavorare. inoltre, come detto prima, controllare gli spazi dei nomi tutti i match e sono corrette.

+0

Questo era il mio problema esatto. Grazie per il suggerimento! – code5

Problemi correlati