2010-10-04 53 views
1

我得到了以下服務:解決通用服務

IRepository<TEntity, TPrimaryKey> 

..for我已經創建了一個實現定義爲:

Repository<TEntity, TPrimaryKey>. 

如何在autofac註冊它,這樣我可以解決這個問題的:

IRepository<User, int> 

回答

4
builder.RegisterGeneric(typeof (Repository<,>)).As(typeof (IRepository<,>)); 

我愛utofac。

0

作爲替代自己的解決方案,你可以嘗試定義一個工廠,用於創建新庫實例:

public interface IRepositoryFactory 
{ 
    IRepository<TEntity, TPrimaryKey> 
     CreateRepository<TEntity, TPrimaryKey>(); 

    // Perhaps other overloads here 
} 

internal class RepositoryFactory : IRepositoryFactory 
{ 
    public IContainer Container { get; set; } 

    public IRepository<TEntity, TPrimaryKey> 
     CreateRepository<TEntity, TPrimaryKey>() 
    { 
     return container.Resolve<Repository<TEntity, TPrimaryKey>>(); 
    } 
} 

如下您可以註冊RepositoryFactory

builder.Register(c => new RepositoryFactory() { Container = c }) 
    .As<IRepositoryFactory>() 
    .SingleInstance(); 

現在你可以聲明IRepositoryFactory作爲構造函數參數並創建新實例。看看例如在使用依賴注入其依賴此ProcessUserAccountUpgradeCommand類:

public ProcessUserAccountUpgradeCommand : ServiceCommand 
{ 
    private readonly IRepositoryFactory factory; 

    ProcessUserAccountUpgradeCommand(IRepositoryFactory factory) 
    { 
     this.factory = factory; 
    } 

    protected override void ExecuteInternal() 
    { 
     // Just call the factory to get a repository. 
     var repository = this.factory.CreateRepository<User, int>(); 

     User user = repository.GetByKey(5); 
    } 
} 

雖然這看起來有點麻煩,使用工廠而不是直接得到一個信息庫,你的設計顯然是一個新的實例是溝通檢索(因爲你調用CreateRepository方法)。從IoC容器返回的實例通常爲expected to have a long life

另一個提示:您可能想重構主鍵類型的使用。總是詢問<User, int>而不是<User>存儲庫的存儲庫會很麻煩。也許你會找到一種方法將工廠內的主鍵抽象出來。

我希望這會有所幫助。

+0

我不同意。服務不必活得太久。獲取服務的代碼不應該關心生命週期,它是一個實現細節。使用工廠意味着生命期永遠不會改變(因爲它意味着每次都應該返回一個新的實例)。例如,可以從容器每次返回一個新實例開始,但稍後切換到單例,以便能夠緩存存儲庫中的對象。 – jgauffin 2010-10-06 09:14:41

+0

我喜歡引用Mark Seeman的話:「注入構造函數注入的依賴往往是長期存在的,但有時候你需要一個短暫的對象,或者只是在運行時才知道一個值的依賴關係。」 「如果您需要短暫的對象,請使用抽象工廠」。請參閱:http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657 – Steven 2010-10-06 11:08:46

+0

imho它仍然不是一個有效的參數,因爲它是一個實現細節。當然。如果我想獲得一個用戶,它不應該由DI創建。但是存儲庫是一種服務,應該被視爲一個。大多數版本庫使用的UnitOfWork具有較長的生命週期(例如在HTTP請求期間) – jgauffin 2010-10-06 11:19:50