2010-03-22 29 views
2

當Windsor實例化類型時,是否可以執行一些自定義處理?Castle Windsor:啓動服務時的自定義處理

類似的東西來:

 container.Register(
        AllTypes.Pick() 
         .FromAssembly(Assembly.GetExecutingAssembly()) 
         .BasedOn<MyMarkerInterface>() 
         .WhenInstantiating(instance => // do some stuff with this instance) 
         .Configure(component => component.Startable().LifeStyle.Singleton) 
         .WithService.Base()); 

目前我們使用的IStartable。由於「開始」代碼(即自定義處理)是相同的,所以將這個邏輯移出每個類別將是很好的。

謝謝! Brian

回答

5

你的意思是像OnCreate方法?

container.Register(
       AllTypes.FromAssembly(Assembly.GetExecutingAssembly()) 
        .BasedOn<MyMarkerInterface>() 
        .WithService.Base() 
        .OnCreate((kernel, instance) => instance.CreatedAt = DateTime.Now) 
); 

單身人士是默認的生活方式,所以你不必明確說明。

但是請注意,與可啓動設施的工作方式相比,此處的行爲略有不同。

  • 組件可啓動時,它會盡快實例化並由容器自身啓動(當所有必需的依賴關係變爲可用時)。
  • OnCreate在您的組件從容器返回之前被調用,但它並不主動創建它。所以如果永遠不會拉這個組件,它的OnCreate將不會被調用。

此外,雖然文檔狀態,OnCreate住在設施,它不是真的了(是的,我們需要更新文檔)。這種方法可以開箱即用。

+0

+1,但與容器無關的解決方案是裝飾器:) – 2010-03-22 18:45:02

+1

我不確定裝飾器。你會把邏輯放在哪裏?在.ctor?一旦你的組件被完全實例化了,如果你想讓它被執行,也就是說屬性連接起來了呢? 第一次打電話給任何方法時懶惰地打電話給它?不知道這是個好主意。 – 2010-03-22 18:58:09

+0

謝謝Krysztof。對於其他讀者,在版本2.1.0中添加了OnCreate方法。 – 2010-03-22 21:00:00

相關問題