2010-02-23 79 views
3

我將autofac添加到現有項目中,並且某些服務實現需要調用它們的Initialize方法並傳遞配置信息。目前我使用的代碼:如何使用autofac執行自定義初始化

builder.Register(context => 
       { 
       var service = new SqlTaxRateProvider(
     context.Resolve<IUserProvider>() 
    ); 
       service.Initialize(config); 
       return service; 

       } 
).As<ITaxService>() 
.SingleInstance(); 

其作品,但我仍然在創建對象我這是什麼,我試圖讓離開這,讓autofac處理對我來說。是否可以配置一個後期創建操作來執行自定義初始化?

爲了給你的就是我的理想之後,這將是代碼的想法:

builder.RegisterType<SqlTaxRateProvider>() 
.As<ITaxService>() 
.OnCreated(service=> service.Initialize(config)) 
.SingleInstance(); 

更新: 我使用Autofac-2.1.10.754-NET35

+1

更好的選擇是擺脫初始化Initialize方法。改爲使用**構造函數注入**。 – 2010-02-24 05:34:29

+0

我同意,在某個階段我會解決它,我只是尋找一個快速解決方案,使我的初始更改更容易。 – 2010-02-24 22:44:23

回答

5
.OnActivating(e => e.Instance.Initialize(...)) 

應做的伎倆。

您也可以調查可啓動模塊(請參閱Startable entry in the Autofac wiki)。

馬克建議在構造函數中進行初始化也是一個好建議。在這種情況下,使用

.WithParameter(new NamedParameter("config", config)) 

將config參數與其他構造函數依賴項合併。

+1

可啓動模塊?我覺得我聽到了某個地方的名字...或者類似 – 2010-02-24 20:33:02

+0

感謝Nick,我認爲NamedParameter將幫助消除Initialize()方法 – 2010-02-24 23:05:17

+1

@Krzysztof yep,Apache Avalon依靠:) – 2010-02-25 10:10:58