簡體   English   中英

如何在注冊時將組件實例化為單例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM