2012-03-12 18 views
5

tengo una fábrica repositorio NhRepositoryFactoryCómo inyectar una fábrica de tipos genéricos 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>(); 
    } 
} 

Con el fin de resolver algunas dependencias repositorios que quiero obtener de ellos el contenedor Autofac. Así que de alguna manera debería inyectar la fábrica Func<IRepository<T>> en mi clase. ¿Cómo puedo lograr esto?
Gracias de antemano.

+0

¿Por qué no se guarda el contenedor Autofac dentro del 'NhRepositoryFactory'? – Steven

+2

Quiero que mi fábrica sea Autofac-agnostic. –

+0

Contiene una sola línea de código. Puedes colocarlo dentro de tu raíz de composición. No tiene que ser contenedor-agnóstico. – Steven

Respuesta

5

El NhRepositoryFactory no contiene lógica comercial y puede formar parte de la raíz de su composición. Esto le permite dejar que tenga una referencia al contenedor. This is just mechanics y no se considera el antipatrón del localizador de servicios. El NhRepositoryFactory se verá así:

// 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>>(); 
    } 
} 

y se puede registrarlo como esto:

+0

Acepto que parece inevitable asociarnos con Autofac de una forma u otra. Lo hice de la manera que sugeriste. La diferencia es que pasé 'ILifetimeScope' en lugar de' Container'. –

+0

Cambié la implementación. He creado la interfaz 'IObjectFactory' con el método' T Create () 'que usa' ILifetimeScope' para crear objetos. Se implementa mediante la clase 'AutofacObjectFactory' que se inyecta en' NhRepositoryFactory'. Entonces ahora no hay acoplamiento de Autofac. –

+0

Después de la refactorización 'IRepositoryFactory' se ha eliminado. Su lugar ha tomado 'IObjectFactory'. –

4

Autofac también es capaz de manejar la creación genérica de forma nativa sin la fábrica.

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

Usando este patrón simplemente puede tomar una dependencia de IRepository y autofac llenará las dependencias.

+1

Lo he intentado de esta manera. Pero cuando alguna clase necesitaba varios repositorios, tuve que agregarlos como parámetros de constructor. Un campo para cada uno de ellos debía ser creado también. Parecía torpe así que creé una fábrica. –

Cuestiones relacionadas