如何在注册时将组件实例化为Singleton ?

本文关键字:实例化 Singleton 组件 注册 | 更新日期: 2023-09-27 18:05:53

我可以想象这可能是相当直接的城堡,但我是新技术,已经谷歌了几个小时没有运气!

我有以下内容:

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

现在很正确地这是惰性加载,即lambda表达式传递到UsingFactoryMethod()不被执行,直到我实际上要求Castle解析我的类的实例。

但是我希望Castle在我注册实例后立即创建它。这可能吗?

如何在注册时将组件实例化为Singleton ?

对于这个简单的例子,您可以只注册一个现有的实例:

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

你可以像这样使用它的启动工具:

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

你可以在这里阅读

重新使用"Instance"的答案可能并不总是可行的(如果类本身有依赖层,则不容易新建它)。在这种情况下,至少在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();