[英]How do I Instantiate component as Singleton at registration?
我可以想象這在 Castle 中可能很簡單,但我是這項技術的新手,並且已經在谷歌上搜索了幾個小時但沒有運氣!
我有以下幾點:
container.Register(
Component.For<MySpecialClass>().UsingFactoryMethod(
() => new MySpecialClass()).LifeStyle.Singleton);
現在完全正確的是,這是延遲加載的,即傳遞給 UsingFactoryMethod() 的 lambda 表達式在我實際要求 Castle 解析我類的實例之前不會執行。
但是我希望 Castle 在注冊后立即創建實例。 這可能嗎?
對於這個簡單的情況,您可以只注冊一個現有實例:
var special = new MySpecialClass();
container.Register(Component.For<MySpecialClass>().Instance(special));
您可以像這樣使用內置的可啟動工具:
container.AddFacility<StartableFacility>();
container.Register(Component.For<MySpecialClass>().LifeStyle.Singleton.Start());
你可以在這里閱讀
重新使用“實例”的答案可能並不總是可行(如果類本身具有依賴層,則不容易對其進行更新)。 在這種情況下,至少在 Windsor 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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.