2011-02-02 8 views
11

En resumen, estoy tratando de usar ELMAH con MVC 2 y Ninject, y necesito usar constructores sin parámetros. Creé una publicación inicial al respecto aquí: Using a parameterless controller constructor with Ninject?Uso de inyección de propiedad en lugar de inyección de constructor

Me aconsejaron usar inyección de propiedad en lugar de inyección de constructor. Así que me mudé de esto:

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository departmentsRepository; 

    public DepartmentsController(IDepartmentsRepository departmentsRepository) 
    { 
     this.departmentsRepository = departmentsRepository; 
    } 

    ... 
} 

a esto:

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
     get { return _departmentsRepository; } 
     set { _departmentsRepository = value; } 
    } 

    ... 
} 

Pero en mis otras funciones del controlador, si intento acceder a DepartmentsRepository o _departmentsRepository, me sale una referencia objeto no establecida como instancia de un objeto error cuando intento acceder a él.

¿Hay algo más que deba hacer aquí?

+6

¿Estás usando 'Ninject.Web.Mvc'? –

+2

Espera, ¿qué? ¿Qué requiere el uso de constructores sin parámetros? – jfar

+0

Tengo un problema extraño en el que una dependencia particular no se resuelve cuando la propiedad tiene un nombre específico. Funciona bien si se renombra, pero todas las demás dependencias se resuelven normalmente (y la misma dependencia se resuelve bien en otros casos para el mismo nombre de propiedad). No tengo ni idea de por qué, pero siempre es algo para probar. –

Respuesta

2

Puede haber 2 razones para que la referencia del objeto no se establezca.

1) Ninject no sabe cómo enlazar IDepartmentsRepository a una aplicación concreta de DepartmentsRepository (dudo que ese es el caso, sin embargo)

2) Si está intentando acceder a la propiedad DepartmentsRepository en el constructor de su controlador, lo hará lanza la excepción (ya que Ninject solo puede inyectar dependencias de propiedad después de que se construye el objeto).

Espero que ayude.

10

Tuve un problema similar. Eche un vistazo a mis preguntas: Using Ninject with Membership.Provider.

Básicamente cuando inicializar DepartmentsController que necesita inyectarse this (es decir, el controlador de departamentos en su Ninject meollo Así que es algo así como:..

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

    [Inject] 
    public IDepartmentsRepository DepartmentsRepository 
    { 
    get { return _departmentsRepository; } 
    set { _departmentsRepository = value; } 
    } 

    public DepartmentsController() 
    { 
    NinjectHelper.Kernel.Inject(this); 
    } 
} 

Dónde NinjectHelper en este caso se pone la corriente Ninject Kernel

+6

esto funcionará, pero es una mejor idea usar un ControllerFactory hacer la inyección para que el controlador no tenga que saber sobre Ninject. –

3

Pruebe algo como esto:

Global.asax.cs

 protected void Application_Start() 
     { 
      DependencyResolver.SetResolver(
       new MyDependencyResolver(
        new StandardKernel(
         new MyModule()))); 
      //... 
     } 

MyDependencyResolver.cs

public class MyDependencyResolver : IDependencyResolver 
    { 
     private IKernel kernel; 

     public MyDependencyResolver(IKernel kernel) 
     { 
      this.kernel = kernel; 
     } 

     public object GetService(Type serviceType) 
     { 
      return kernel.TryGet(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type serviceType) 
     { 
      return kernel.GetAll(serviceType); 
     } 
    } 

MyModule.cs

public class MyModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IDepartmentsRepository>().To<DepartmentsRepository>(); 
     } 
    } 
+0

¿Cómo ayuda esto a responder la pregunta? –

+1

@dave Esto puede resolver su problema de 'referencia de objeto no establecido en una instancia de un objeto' ... En cuanto a Ninject.Web.Mvc, no lo intenté. – frennky

0

Daniel T. Como en el comentario anterior publicada, que debe salir Ninject.Web.Mvc. Si usa NinjectHttpApplication en ese proyecto, lo autocadenará todo, de modo que cuando NinjectControllerFactory construya un nuevo controlador, llamará a Inject() para que complete las inyecciones de propiedad.

Cuestiones relacionadas