2012-04-25 16 views
24

He creado una nueva aplicación web MVC y tengo referencias a Ninject.dll, Ninject.Web.Common.dll y Ninject.Web.MVC.dll.¿Cómo trabajo con Ninject en una aplicación 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) 
     { 
     }   
    } 

me sale el error "La secuencia no contiene elementos". ¿Qué estoy haciendo mal?

Detalles del error:

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

se puede añadir el StackTrace completo? –

+0

puedo actualizar mi post – Mediator

+0

[Línea 53] (https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/N injectMvcHttpApplicationPlugin.cs # L53) parece estar intentando eliminar el [DataAnnotationsModelValidatorProvider] (http://msdn.microsoft.com/en-us/library/system.web.mvc.dataannotationsmodelvalidatorprovider.aspx) de MVC. ¿Estás usando la versión correcta de MVC/has configurado tú mismo de alguna manera? – Rup

Respuesta

24

va a derivar de NinjectHttpApplication y está utilizando App_Start al mismo tiempo. ¡Elige uno! Lea el docu of Ninject.MVC3 para obtener más información.

+0

Ah, limpio, entonces la razón por la que está viendo el error sobre eliminar DataAnnotationsModelValidatorProvider es que está inicializando Ninject por segunda vez y el primer init ya lo eliminó. Supongo que es un truco útil, pero probablemente fracasará más gratamente. – Rup

+5

@Remo Gloor - Tengo que decir que estos dos enfoques diferentes son increíblemente confusos para el principiante incluso con la documentación. La documentación en realidad dice esencialmente 'son exactamente iguales', pero mirando el código, la forma Nuget tiene un método 'RegisterServices' vacío y la forma NinjectHttpApplication tiene 'kernal.Load (Assembly.GetExecutingAssemby)'. Estos no son los mismos y se agradecería mucho más orientación sobre esa página de documentación. Esta es una de las primeras páginas que las personas probablemente encontrarán en Ninject y un poco más de detalle sería genial para beginneres –

+0

@Simon_Weaver Se agregó el método RegisterServices a la forma NinjectHttpApplication para tener la misma implementación del código de registro. Ahora es realmente lo mismo. Si necesita más información, agregue TODO's que falta en su opinión o añádalo usted mismo si conoce la respuesta. –

39

Para ser explícitamente claro acerca de esto, si se utiliza NuGet para agregar el paquete 'Ninject.Mvc3' (he usado la versión 3.0.0.6), no hay necesidad de hacer ninguna modificación aglobal.asax.cs. El paquete NuGet hace la magia para usted creando la clase NinjectWebCommon en la carpeta App_Start de su proyecto MVC 4.

Lo digo porque parece haber seguido un tutorial similar al del póster original (seguí un artículo sobre The Code Project llamado 'Dependency Injection in asp.net mvc4 and webapi using Ninject'), y tenía exactamente el mismo problema que el póster original. El artículo Proyecto Código no dejan claro que usted debe ya sea uso NuGet (y no toque global.asax.cso añadir las referencias ninject manualmente (y modificar global.asax.cs).

7

Asegúrese de que no se hace referencia a una proyecto que también utiliza el NinjectMVC3 App_Start. Después de la eliminación de la referencia a tal, mi proyecto comenzó a trabajar. también, como se dijo antes, compruebe los espacios de nombres de todo el partido y son correctos.

+0

Ese fue mi problema exacto. ¡Gracias por la pista! – code5

Cuestiones relacionadas