6

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 ...

+0

Avete registrato il controller? –

+0

... Non sarebbe necessario solo per l'iniezione delle dipendenze del costruttore? Forse frainteso come dovrebbe funzionare. –

+0

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). –

risposta

6

Sia costruttore e proprietà lavoro di iniezione quando l'oggetto radice viene risolto dal contenitore. In questo caso, il tuo AccountController sarebbe l'oggetto root che Windsor avrebbe bisogno di creare.

Per eseguire il cablaggio, è necessario utilizzare controller factory. Una volta che il controller è registrato e risolto dal contenitore, tutto dovrebbe funzionare come previsto.

+0

In realtà quello era in origine il tutorial che ho iniziato, e avevo già costruito questo controller ... ma questo sembra non fare nulla.Ho anche l'installer ... ancora niente. –

+0

OK, questo e il commento di Charleh mi hanno fatto capire cosa stavo facendo male. Lo scriverò nella mia domanda. Grazie! –