2012-03-12 13 views
5

Ho una fabbrica repository NhRepositoryFactoryCome iniettare una fabbrica di tipi generici con Autofac

public interface IRepositoryFactory 
{ 
    IRepository<T> Create<T>() where T: Entity; 
} 

public class NhRepositoryFactory: IRepositoryFactory 
{ 
    public IRepository<T> Create<T>() where T : Entity 
    { 
    return new NhRepository<T>(); 
    } 
} 

Al fine di risolvere alcuni repository dipendenze voglio farli dal contenitore Autofac. Quindi dovrei in qualche modo iniettare lo Func<IRepository<T>> factory nella mia classe. Come posso realizzare questo?
Grazie in anticipo.

+0

Perché non si memorizza il contenitore Autofac all'interno di 'NhRepositoryFactory'? – Steven

+2

Voglio che la mia fabbrica sia Autofac-agnostic. –

+0

Contiene solo una singola riga di codice. Puoi posizionarlo all'interno della tua radice di composizione. Non deve essere indipendente dal contenitore. – Steven

risposta

5

Il NhRepositoryFactory non contiene alcuna logica aziendale e può essere parte della radice della composizione. Questo ti permette di avere un riferimento al contenitore. This is just mechanics e non è considerato l'anti-pattern del localizzatore di servizi. Il NhRepositoryFactory sarà simile a questa:

// This class is part of your composition root 
public class NhRepositoryFactory : IRepositoryFactory 
{ 
    private readonly Container container; 

    public NhRepositoryFactory(Container container) 
    { 
     this.container = container; 
    } 

    public IRepository<T> Create<T>() where T : Entity 
    { 
     return this.container.Resolve<NhRepository<T>>(); 
    } 
} 

ed è possibile registrare in questo modo:

+0

Concordo sul fatto che sembra inevitabile associarsi ad Autofac in un modo o nell'altro. L'ho fatto nel modo che mi hai suggerito. La differenza è che ho passato 'ILifetimeScope' invece di' Container'. –

+0

Ho cambiato l'implementazione. Ho creato l'interfaccia 'IObjectFactory' con' T Crea il metodo () 'che usa' ILifetimeScope' per creare oggetti. È implementato dalla classe 'AutofacObjectFactory' che viene iniettata in' NhRepositoryFactory'. Quindi ora non esiste un accoppiamento Autofac. –

+0

Dopo che il refactoring 'IRepositoryFactory' è stato eliminato. La sua posizione ha richiesto 'IObjectFactory'. –

4

Autofac è anche in grado di gestire la creazione generica in modo nativo, senza la fabbrica.

builder.RegisterGeneric(typeof(NhRepository<>)) 
    .As(typeof(IRepository<>)) 
    .InstancePerLifetimeScope(); 

Utilizzando questo modello si può semplicemente prendere una dipendenza da IRepository e autofac riempirà le dipendenze.

+1

L'ho provato in questo modo. Ma quando alcune classi avevano bisogno di diversi repository, dovevo aggiungerli come parametri del costruttore. Doveva essere creato anche un campo per ognuno di essi. Sembrava goffo, quindi ho creato una fabbrica. –