2012-03-12 15 views
5

mam fabrykę repozytorium NhRepositoryFactoryJak wstrzykiwać fabrykę typów generycznych z 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>(); 
    } 
} 

W celu rozwiązania niektórych repozytoriów zależności chcę dostać je z pojemnika Autofac. Więc powinienem jakoś wstrzyknąć do mojej klasy fabrykę Func<IRepository<T>>. Jak mogę to zrobić?
Z góry dziękuję.

+0

Dlaczego nie chcesz przechowywać pojemnika Autofac wewnątrz 'NhRepositoryFactory'? – Steven

+2

Chcę, aby moja fabryka była autodiagnostyczna. –

+0

Zawiera tylko jedną linię kodu. Możesz umieścić go wewnątrz katalogu głównego kompozycji. To nie musi być agnostyka kontenera. – Steven

Odpowiedz

5

Nie zawiera żadnej logiki biznesowej i może być częścią katalogu głównego kompozycji. Dzięki temu możesz mieć odniesienie do kontenera. This is just mechanics i nie jest uważany za wzór Anti-Pattern Service. NhRepositoryFactory będzie wyglądać następująco:

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

I można zarejestrować go tak:

+0

Zgadzam się, że wydaje się nieuniknione, że w ten czy inny sposób współpracujemy z Autofac. Zrobiłem to tak, jak zasugerowałeś. Różnica polega na tym, że przekazałem 'ILifetimeScope' zamiast' Container'. –

+0

Zmieniłem implementację. Stworzyłem interfejs 'IObjectFactory' z metodą' T Create () ', która używa' ILifetimeScope' do tworzenia obiektów. Jest on implementowany przez klasę 'AutofacObjectFactory', która jest wstrzykiwana do' NhRepositoryFactory'. Teraz nie ma sprzęgania autofac. –

+0

Po usunięciu refaktoryzacji 'IRepositoryFactory'. Jego miejsce zajęło 'IObjectFactory'. –

4

Autofac jest również w stanie obsłużyć rodzajowe tworzenia natywnie bez fabryce.

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

Stosując ten wzór można po prostu wziąć zależność IRepository i autofac będzie wypełnić zależności.

+1

Próbowałem tego w ten sposób. Ale gdy niektóre klasy potrzebowały kilku repozytoriów, musiałem dodać je jako parametry konstruktora. Zostało również utworzone pole dla każdego z nich. Wydawało mi się niezdarne, więc stworzyłem fabrykę. –

Powiązane problemy