2011-11-07 5 views
5

Domanda semplice, immagino, ma ho passato un'ora a cercare di ottenere una classe base per i miei controller in modo da avere alcuni servizi iniettati tramite l'iniezione di proprietà. Inizialmente le proprietà erano protette con scope, ma gli oggetti continuavano a tornare nulli, una volta modificato l'ambito su public funzionava. Esiste comunque la possibilità di proteggere le proprietà e far funzionare l'IoC?Perché Ninject non risolve le proprietà protette in una classe base?

Ecco il mio setup.

public class BaseController : Controller 
{ 
    [Inject] 
    protected LoggingInterface.ILogger<BaseController> Logger { set; get; } 

    [Inject] 
    protected IRepository Repository { set; get; } 

    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     .... 

     base.OnAuthorization(filterContext); 
    } 
} 

e il boot-strapper nel NinjectMVC3 App_Start

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind(typeof(LoggingInterface.ILogger<>)).To(typeof(Log4NetLogger<>)); 
     kernel.Bind<IRepository>().To<Repository>(); 
     kernel.Bind<IUserService>().To<UserService>(); 
    } 

Grazie, Stephen

risposta

6

Non si può iniettare in proprietà che non hanno setter pubblico. Entrambe le proprietà del Logger e del Repository sono protette da , quindi non è possibile assegnare a Ninject un valore. Dovrai cambiare la visibilità del setter se vuoi raggiungere questo obiettivo. Oppure utilizzare l'iniezione del costruttore. Mentre questo avrebbe perfettamente senso per la proprietà del repository che sembra necessaria, non avrebbe senso per la proprietà del logger. Quindi immagino che dovrai renderlo pubblico.

+1

Grazie Darin, questo è quello che ho concluso solo per scherzarci. La ragione convincente per le proprietà è che i discendenti si fanno prendere dall'iniezione di ctor. Stai attento. –

4

Sono sicuro che la bandiera InjectNonPublic sul NinjectSettings consente di configurare a fare quello che vuoi - closest link I can find quickly

Che si tratti di andare a essere sostenuta per un certo periodo di tempo significativo, non lo so - privati ​​per via parenterale è solo una cattiva idea (insieme a Property Injection e ai furfanti associati: P)

Problemi correlati