簡體   English   中英

Autofac - 在構建之前解決

[英]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因此您只需注冊CacheHelperICacheRepository

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范圍。 因為CacheHelperSingleInstance僅僅的單個實例ICacheRepository將被使用,其可導致對錯誤。 有關詳細信息,請參閱強制依賴性

在您的情況下,您似乎不需要這種注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM