Как при регистрации зарегистрировать компонент как синглтон? - PullRequest
6 голосов
/ 18 августа 2011

Я могу себе представить, что это может быть довольно просто сделать в Касле, но я новичок в этой технологии и уже несколько часов безуспешно гуглю!

У меня есть следующее:

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

Теперь совершенно справедливо, что это загружается с отложенной загрузкой, то есть лямбда-выражение, переданное в UsingFactoryMethod (), не выполняется, пока я фактически не прошу Касла Разрешить мне экземпляр класса.

Но я бы хотел, чтобы Касл создал экземпляр, как только я его зарегистрирую. Возможно ли это?

Ответы [ 3 ]

10 голосов
/ 17 октября 2013

Вы можете просто использовать встроенное средство Startable, например:

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

Вы можете прочитать об этом здесь

10 голосов
/ 18 августа 2011

Для этого простого случая вы можете просто зарегистрировать существующий экземпляр :

var special = new MySpecialClass();
container.Register(Component.For<MySpecialClass>().Instance(special));
1 голос
/ 28 ноября 2012

Ответ с использованием «Экземпляра» не всегда может быть выполнимым (если класс сам имеет слои зависимостей, его будет нелегко обновить).В этом случае, по крайней мере, в 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();
...