2010-04-29 16 views
6

Sto cercando di capire come risolvere un'istanza in qualche parte del codice.Resolve esempio - Autofac

Alla domanda di avvio ho registrato un tipo

static void Main() 
{  
    var builder = new ContainerBuilder(); 
    builder.RegisterType<Foo>().As<IFoo>(); 
} 

Ora, come posso risolvere un caso da qualche parte nel codice?

In StructureMap c'è un oggetto statico ObjectFactory.GetInstance<IFoo>()

risposta

10

Leggi su Getting Started. Dovresti iniziare.

Prima di tutto, ciò che si sta cercando è la container. Costruirla dal ContainerBuilder come in questa semplice applicazione WinForms:

static void Main() 
{ 
    using (var container = builder.Build()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var mainForm = container.Resolve<MainForm>(); 
     Application.Run(mainForm) 
    } 
} 

L'idea generale è che hai solo per risolvere il primo o il più in alto grado. Il contenitore gestirà la creazione di tutte le altre istanze basate sull'integrazione delle dipendenze tramite i parametri del costruttore.

Se il modello DI è seguito in tutta l'applicazione si dovrebbe avere solo a toccare il contenitore una volta all'avvio.

Come si risolve l'istanza più in alto dipende in gran parte dal tipo di applicazione che si sta costruendo. Se si tratta di un'app Web, lo ASP.Net integration e lo MVC integration si prenderanno cura di esso per te. (Dopo tutto, l'istanza più in alto in ASP.Net è la Application che è fuori dal nostro controllo).

D'altra parte, se si tratta di un'app console o di un'app WinForms, la prima istanza verrà risolta manualmente in Main, come nell'esempio precedente.

+0

Questo è l'esempio, ma cosa succede se ho bisogno di un caso in più classi? Impossibile registrare il tipo in ogni classe. – user137348

+1

Ma devi in ​​qualche modo risolvere questa istanza più in alto da qualche parte nel codice. I tipi vengono registrati all'avvio (Global.asax) e quindi è necessario risolvere l'istanza più in alto da qualche parte nel codice. Alla fine, ho trovato un articolo che descrive questo. http://geekswithblogs.net/Sharpoverride/archive/2009/08/15/ioc-in-.net-part-1-autofac.aspx Cosa ne pensi di questo approccio? – user137348

+0

Vedere la mia risposta aggiornata ... e sì, l'approccio di @Sharpoverrides è ok, assicura che Global.asax non sia ingombrante con il codice di costruzione del contenitore. Dopotutto, dovresti davvero scrivere le unittest che testano il container, e avere una classe a responsabilità unica che costruisce il contenitore rende più facile il test. –