2015-12-28 67 views
2

在構建容器之前可以解析Unity依賴關係。 Autofac也可以嗎? 下面的代碼演示了我的場景 - 我需要解析ICacheRepository以便「新建」單身人士CacheHelperAutofac - 在構建之前解析

在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; 
    } 
} 
+0

你的目標是讓'cacheHelper'成爲一個單身人士嗎?這可以通過另一種方式來實現。 –

回答

4

您不應該在構建過程中解析組件。 Autofac能夠解決對象圖的依賴關係。在你的情況CacheHelper取決於ICacheRepository,所以你只需要註冊CacheHelperICacheRepository

var builder = new ContainerBuilder(); 
builder.RegisterType<CacheRepository>().As<ICacheRepository>(); 
builder.RegisterType<CacheHelper>().As<CacheHelper>(); 

Autofac將解決CacheHelper它會創建依賴關係圖,並與OFSI ICacheRepository實例中創建的CacheHelper實例。如果你需要有一個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的實例,這可能會導致錯誤。有關更多信息,請參見Captive Dependency

就你而言,它似乎並不像你需要這種註冊。

+0

啊,當然。說得通。謝謝! –

+0

請注意,在最後兩個例子中,'CacheRepository'成爲'CacheHelper'的[Captive Dependency](Captive Dependency)(http://blog.ploeh.dk/2014/06/02/captive-dependency/),這往往會導致在bug中。 – Steven

+0

@Steven:很好,在寫我的答案時沒有看到它。我編輯了我的帖子。謝謝。 –