2012-03-26 11 views
6

Sto lavorando a un'applicazione composta da molti moduli, alcuni con dipendenze su altri moduli. Ora ho deciso di utilizzare Autofac per risolvere le dipendenze circolari e migliorare l'architettura in generale.autofac - uso corretto nell'applicazione multi modulo

Per configurare autofac, utilizzo il metodo xml (http://code.google.com/p/autofac/wiki/XmlConfiguration).

Ora non sono sicuro su come implementare Autofac. Devo avere un riferimento a autofac in ogni modulo nella mia applicazione? Il che significa che devo registrare tutti i componenti ogni volta che voglio risolvere una dipendenza ...

ContainerBuilder builder = new ContainerBuilder(); 
builder.RegisterModule(new ConfigurationSettingsReader("autofac", configPath)); 
IContainer container = builder.Build(); 
IWhatever w = container.Resolve<IWhatever>(); 

È questo il modo per farlo?

O è meglio avvolgere l'autofac in un modulo separato? Con questo approccio avrei dovuto registrare i moduli solo una volta (all'avvio dell'applicazione) e potrebbe utilizzare l'Autofac avvolto per risolvere le dipendenze ...

IWhatever w = container.Resolve<IWhatever>(); 

spero che qualcuno mi può dire il modo migliore per utilizzare autofac.

grazie!

+2

Il modo migliore per utilizzare Autofac (o qualsiasi altro contenitore DI) è fare riferimento come raramente necessario. [Questa risposta] (http://stackoverflow.com/a/1410738/644812) potrebbe essere utile. –

+0

grazie, questo è quello che sto pensando anche io. Non sono sicuro di quale sia la procedura migliore per utilizzare Autofac ... – Fabian

risposta

-1

Il modulo separato per container non è solo un'opzione migliore, è l'unica opzione giusta. Le istanze del contenitore IoC AFAIK devono essere singleton.

Almeno in questo modo ho utilizzato Unity: si crea un'istanza statica del contenitore disponibile pubblicamente, inizializzandola all'avvio dell'applicazione e quindi accedendo da tutti i moduli.

+4

No, no e no. Avere un singleton (di qualsiasi cosa) raramente è una buona idea. Ci sono nella maggior parte dei casi una soluzione migliore. La stessa cosa qui. – jgauffin

+0

E quale è, non ne hai fornito uno? Non è possibile utilizzare il codice fornito nella domanda in ogni modulo perché questo creerà un sacco di spese generali. Non lo so per certo, ma è possibile che chiamare builder.Build crei istantaneamente tutti gli oggetti nel contenitore - una pessima idea. – vlad2135

+2

Un sacco di spese generali? Il contenitore viene creato una volta nella vita delle applicazioni. – jgauffin