![](/img/trans.png)
[英]Autofac. RegisterType after .Build and register/resolve list
[英]Autofac - resolve before build
使用Unity可以在構建容器之前解析依賴關系。 這也適用於Autofac嗎? 下面的代碼演示了我的場景 - 我需要解析ICacheRepository
才能“新建”單例CacheHelper
。
在Unity中,只需使用container.Resolve<ICacheRepository>()
代替???。 Autofac怎么樣?
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
var cacheHelper = new CacheHelper(???);
builder.RegisterInstance(cacheHelper).As<CacheHelper>();
CacheHelper
類對CacheRepository
具有構造函數依賴性。
public class CacheHelper
{
private readonly ICacheRepository _repository;
public CacheHelper(ICacheRepository repository)
{
_repository = repository;
}
}
您不必在構建過程中解析組件。 Autofac能夠解決對象圖依賴性。 在您的情況下, CacheHelper
依賴於ICacheRepository
因此您只需注冊CacheHelper
和ICacheRepository
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>();
當Autofac解析CacheHelper
,它將創建依賴圖並使用CacheHelper
實例創建ICacheRepository
實例。 如果你需要一個Singleton,你可以告訴Autofac只創建一個實例。
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.RegisterType<CacheHelper>().As<CacheHelper>().SingleInstance();
另一種解決方案是注冊lambda表達式,這些注冊在您需要時調用,因此您可以在構建過程中解決問題:
var builder = new ContainerBuilder();
builder.RegisterType<CacheRepository>().As<ICacheRepository>();
builder.Register(c => new CacheHelper(c.Resolve<ICacheRepository>()))
.As<CacheHelper>()
.SingleInstance(); // It will result of having one CacheHelper whereas
// ICacheRepository is declared as .InstancePerDependency
請注意此解決方案,因為ICacheRepository
是在沒有范圍的情況下聲明的,默認情況下將使用InstancePerDependency
范圍。 因為CacheHelper
是SingleInstance
僅僅的單個實例ICacheRepository
將被使用,其可導致對錯誤。 有關詳細信息,請參閱強制依賴性 。
在您的情況下,您似乎不需要這種注冊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.