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

时间:2011-08-18 13:19:57

标签: c# castle-windsor

我可以想象这在Castle中可能会非常直接,但我对这项技术不熟悉并且谷歌几个小时都没有运气!

我有以下内容:

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

现在非常正确,这是延迟加载的,即传递给UsingFactoryMethod()的lambda表达式在我实际要求Castle解析类的实例之前没有被执行。

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

3 个答案:

答案 0 :(得分:10)

您可以使用构建它的Startable工具,如下所示:

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

您可以阅读here

答案 1 :(得分:9)

对于这个简单的案例,您可以register an existing instance

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

答案 2 :(得分:1)

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