2011-08-18 61 views
6

我可以想象這在Castle中可能會非常簡單,但我對這項技術很陌生,並且幾個小時沒有運氣就一直在Google上搜索!如何在註冊時將組件作爲單例實例化?

我有以下幾點:

container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
    () => new MySpecialClass()).LifeStyle.Singleton); 

現在非常正確,這是懶惰加載,即傳遞給UsingFactoryMethod()沒有被執行的lambda表達式,直到我真正讓城堡化解了我類的實例。

但是我希望Castle一旦註冊它就創建實例。這可能嗎?

回答

8

你可以只使用內置它可啓動設備,像這樣:

container.AddFacility<StartableFacility>(); 
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start()); 

你可以閱讀一下here

7

對於你可以這個簡單的例子只是register an existing instance

var special = new MySpecialClass(); 
container.Register(Component.For<MySpecialClass>().Instance(special)); 
+0

謝謝!這是我最終使用的 - container.Register(Component.For ()。Instance(new MySpecialClass())); – jameskind

+1

這看起來不是最好的方法,因爲你沒有離開實例到容器,因此打破了IoC模式。 –

+0

@DavidPerlman正確的是,當我回答這個問題時,我認爲並不是像MosheLevi最近的回答所描述的那樣簡單。 –

1

再使用「實例」可能並不總是可行的(如果該類依賴自身的層答案,它不會是容易的新它)。 在這種情況下,至少在溫莎2.5,你可以這樣做:

public static void ForceCreationOfSingletons(this IWindsorContainer container) 
    { 
     var singletons = 
      container.Kernel.GetAssignableHandlers(typeof (object)) 
        .Where(h => h.ComponentModel.LifestyleType == LifestyleType.Singleton); 

     foreach (var handler in singletons) 
     { 
      container.Resolve(handler.ComponentModel.Service); 
     } 
    } 

    // usage container.ForceCreationOfSingletons();