2011-01-05 12 views
56

Qual è il metodo consigliato per ottenere il contenitore Autofac all'interno di una classe nell'applicazione? Autofac fornisce la risoluzione di una proprietà IContainer su una classe o devo memorizzare il contenitore globalmente dopo averlo creato?Risolvi IContainer

risposta

88

Avrete bisogno di IComponentContext o ILifetimeScope per la maggior parte degli scopi. Questi sono forniti automaticamente da Autofac, quindi tutto ciò che devi fare è prendere una dipendenza (costruttore) su uno di essi e l'istanza corrente verrà iniettata.

Entrambe le interfacce forniscono i Resolve() operazioni standard, mentre ILifetimeScope estende IComponentContext aggiungendo metodi per avviare nuove vite nidificate.

componenti che desiderano utilizzare i servizi del contenitore di accedere ad altri componenti devono farlo entro il proprio ambito di applicazione, piuttosto che il 'globale' IContainer, in modo che l'istanza corretta può essere restituito. Per esempio. all'interno di una richiesta HTTP, l'iniettato IComponentContext o ILifetimeScope sarà quello per la richiesta corrente.

La maggior parte dei problemi che richiedono un contesto iniettato possono essere superati (spesso in modo più elegante) utilizzando i tipi di relazione - vedere: http://autofac.readthedocs.org/en/latest/resolve/relationships.html.

+1

Sarebbe opportuno notare che esiste una differenza tra il cablaggio automatico di quella classe e la sua creazione mediante un delegato. Nel mio caso, ha funzionato: 'builder.RegisterType ()' mentre il seguente non è riuscito con un oggetto ObjectDisposedException in fase di esecuzione una volta chiamato 'IComponentContext':' builder.Register (c => new QueryProcessor (c)) ' . – Steven

+9

'builder.Register (c => new QueryProcessor (c))' deve essere: 'builder.Register (c => new QueryProcessor (c.Resolve ()))' - 'c' è un temporaneo che vive su base operativa. HTH! –

Problemi correlati