OK Penso che ci sia forse troppo informazioni su Castle Windsor perché cercare queste parole chiave mi dà esempi di tutto, e francamente non capisco abbastanza su come funziona correttamente risolvere questo problema. Ho provato parecchie permutazioni con poca fortuna a questo punto.Castle Windsor IoC Property Injection simple how-to
Ho un IUnitOfWorkFactory
che voglio istanziare come un singleton. Quindi, installare il Castello di Windsor, scrivere un po 'di codice in questo modo:
iocContainer = new WindsorContainer()
.Install(FromAssembly.This());
var propInjector = iocContainer.Register(
Component.For<IUnitOfWorkFactory>()
.LifestyleSingleton()
.Instance(new NHUnitOfWorkFactory())
);
propInjector.Resolve<IUnitOfWorkFactory>();
Questo viene chiamato dal mio metodo Application_Start
.
Ho un AccountController
cablato in questo modo:
public class AccountController : SecureController
{
public IUnitOfWorkFactory UnitOfWorkFactory { get; set; }
...
... per quanto posso capire, questo dovrebbe solo "lavoro" (anche se non chiedetemi come). Ma la mia proprietà è sempre nullo quando provo ad usarlo.
Sembra che mi manchi qualcosa di stupido e semplice, ma non ho idea di cosa sia.
Ho anche provato
var propInjector = iocContainer.Register(
Component.For<IUnitOfWorkFactory>()
.ImplementedBy<NHUnitOfWorkFactory>()
.LifestyleSingleton()
);
senza successo.
Cosa sto sbagliando?
CONCLUSIONE
mi mancava diversi passaggi qui. Avevo costruito un programma di installazione e un bootstrapper per lo tutorial, ma ho registrato i miei servizi nel punto sbagliato ... prima di costruire la fabbrica di controller. Ora il mio programma di avvio automatico assomiglia a questo:
iocContainer = new WindsorContainer()
.Install(FromAssembly.This());
var controllerFactory = new WindsorControllerFactory(iocContainer.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
iocContainer.Register(
Component.For<IUnitOfWorkFactory>()
.ImplementedBy<NHUnitOfWorkFactory>()
.LifestyleSingleton()
);
... e le mie iniezioni di proprietà non erano più nulla .... ora non mi resta che eseguire il debug gli altri 87 problemi ...
Avete registrato il controller? –
... Non sarebbe necessario solo per l'iniezione delle dipendenze del costruttore? Forse frainteso come dovrebbe funzionare. –
No, il contenitore deve creare la radice del grafico dell'oggetto. In questo caso il controller. Questo è il caso dell'iniezione Property o Constructor (perché funzionano allo stesso modo). –