2011-02-02 9 views
11

Per farla breve, sto cercando di utilizzare ELMAH con MVC 2 e Ninject e ho bisogno di utilizzare costruttori senza parametri. Ho creato un post iniziale su di esso qui: Using a parameterless controller constructor with Ninject?Utilizzare l'iniezione di proprietà invece dell'iniezione del costruttore

Mi è stato consigliato di utilizzare l'iniezione di proprietà invece dell'iniezione del costruttore. Così mi sono trasferito da questo:

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository departmentsRepository; 

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

    ... 
} 

a questo:

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

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

    ... 
} 

ma nel mio altre funzioni del controller, se provo ad accedere DepartmentsRepository o _departmentsRepository, ottengo un riferimento oggetto non impostato a un'istanza di un errore dell'oggetto quando provo ad accedervi.

C'è qualcos'altro che devo fare qui?

+6

Si sta utilizzando 'Ninject.Web.Mvc'? –

+2

Aspetta cosa? Cosa ti richiede di usare costruttori senza parametri? – jfar

+0

Sto avendo uno strano problema in cui una particolare dipendenza non viene risolta quando la proprietà ha un nome specifico. Funziona bene se rinominato, ma tutte le altre dipendenze si risolvono normalmente (e la stessa dipendenza si risolve in altri casi con lo stesso nome di proprietà). Non ne ho idea, ma è sempre qualcosa da provare. –

risposta

2

Ci potrebbero essere 2 motivi per cui il riferimento all'oggetto non ha impostato un'eccezione.

1) Ninject non sa come associare IDepartmentsRepository ad una concreta attuazione di DepartmentsRepository (dubito che sia il caso però)

2) Se si sta tentando di accedere alla proprietà DepartmentsRepository nel costruttore del controllore, lo farà lanciare l'eccezione (dato che Ninject è in grado di iniettare dipendenze di proprietà solo dopo che l'oggetto è stato costruito).

Spero che questo aiuti.

10

Ho avuto un problema simile. Dai un'occhiata alle mie domande: Using Ninject with Membership.Provider.

Fondamentalmente, quando si inizializza DepartmentsController che devono essere iniettate this (cioè il controller reparti nella vostra Ninject kernal Così la sua qualcosa come:..

public class DepartmentsController : Controller 
{ 
    private IDepartmentsRepository _departmentsRepository; 

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

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

Dove NinjectHelper in questo caso ottiene la corrente Ninject Kernel

+6

funzionerà, ma è meglio usare ControllerFactory per fare l'iniezione in modo che il controllore non debba conoscere Ninject. –

3

provare qualcosa di simile:

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

in che modo questo aiuta a rispondere alla domanda? –

+1

@dave Questo può risolvere il suo problema "oggetto di riferimento non impostato su un'istanza di un oggetto" ... Per quanto riguarda Ninject.Web.Mvc, non l'ho provato. – frennky

0

Come Daniel T. nel commento di cui sopra scritto, si dovrebbe verificare Ninject.Web.Mvc. Se si utilizza la NinjectHttpApplication in quel progetto, verrà autowire tutto per te, in modo che quando NinjectControllerFactory costruisce un nuovo controller, chiamerà Inject() affinché tu possa riempire le iniezioni di proprietà.

Problemi correlati