2012-03-12 107 views
5

我有一個倉庫工廠NhRepositoryFactory如何注入一個工廠的泛型類型與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>(); 
    } 
} 

爲了解決一些庫依賴我想從Autofac容器得到他們。所以我應該以某種方式將Func<IRepository<T>>工廠注入我的班級。我怎樣才能做到這一點?
在此先感謝。

+0

爲什麼不將Autofac容器存儲在'NhRepositoryFactory'中? – Steven 2012-03-12 08:45:32

+2

我想我的工廠是Autofac不可知的。 – 2012-03-12 08:46:42

+0

它只包含一行代碼。您可以將其放置在您的組合根目錄中。它不必是容器不可知的。 – Steven 2012-03-12 08:49:33

回答

5

NhRepositoryFactory不包含業務邏輯,可以是您的組合根的一部分。這允許你讓它有一個對容器的引用。 This is just mechanics並且不被視爲服務定位器反模式。該NhRepositoryFactory看起來就像這樣:

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

你可以這樣註冊它:

+0

我同意以這種或那種方式與Autofac結合似乎是不可避免的。我按照你的建議來完成它。不同的是,我通過'ILifetimeScope'而不是'Container'。 – 2012-03-12 14:00:34

+0

我改變了實現。我用'T Create ()'創建了'IObjectFactory'接口,該方法使用ILifetimeScope來創建對象。它由注入'NhRepositoryFactory'的'AutofacObjectFactory'類實現。所以現在沒有Autofac耦合。 – 2012-03-13 04:56:20

+0

重構後'IRepositoryFactory'已被刪除。它的地方採取了'IObjectFactory'。 – 2012-03-13 05:09:08

4

Autofac也能在本地處理一般不設立工廠。

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

使用此模式,您可以簡單地依賴IRepository,autofac將填充依賴項。

+1

我試過這種方式。但是當某個類需要多個存儲庫時,我不得不將它們添加爲構造函數參數。他們每個人的領域也將被創造。這看起來很笨拙,所以我創建了一家工廠。 – 2012-03-13 03:12:48