我得到了以下服務:解決通用服務
IRepository<TEntity, TPrimaryKey>
..for我已經創建了一個實現定義爲:
Repository<TEntity, TPrimaryKey>.
如何在autofac註冊它,這樣我可以解決這個問題的:
IRepository<User, int>
我得到了以下服務:解決通用服務
IRepository<TEntity, TPrimaryKey>
..for我已經創建了一個實現定義爲:
Repository<TEntity, TPrimaryKey>.
如何在autofac註冊它,這樣我可以解決這個問題的:
IRepository<User, int>
builder.RegisterGeneric(typeof (Repository<,>)).As(typeof (IRepository<,>));
我愛utofac。
作爲替代自己的解決方案,你可以嘗試定義一個工廠,用於創建新庫實例:
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>
存儲庫的存儲庫會很麻煩。也許你會找到一種方法將工廠內的主鍵抽象出來。
我希望這會有所幫助。
我不同意。服務不必活得太久。獲取服務的代碼不應該關心生命週期,它是一個實現細節。使用工廠意味着生命期永遠不會改變(因爲它意味着每次都應該返回一個新的實例)。例如,可以從容器每次返回一個新實例開始,但稍後切換到單例,以便能夠緩存存儲庫中的對象。 – jgauffin 2010-10-06 09:14:41
我喜歡引用Mark Seeman的話:「注入構造函數注入的依賴往往是長期存在的,但有時候你需要一個短暫的對象,或者只是在運行時才知道一個值的依賴關係。」 「如果您需要短暫的對象,請使用抽象工廠」。請參閱:http://stackoverflow.com/questions/2045904/dependency-inject-di-friendly-library/2047657#2047657 – Steven 2010-10-06 11:08:46
imho它仍然不是一個有效的參數,因爲它是一個實現細節。當然。如果我想獲得一個用戶,它不應該由DI創建。但是存儲庫是一種服務,應該被視爲一個。大多數版本庫使用的UnitOfWork具有較長的生命週期(例如在HTTP請求期間) – jgauffin 2010-10-06 11:19:50