Замок Виндзор: кастомная обработка при запуске сервиса - PullRequest
2 голосов
/ 22 марта 2010

Можно ли выполнить некоторую пользовательскую обработку, когда Windsor создает экземпляр типа?

Что-то похожее на:

        container.Register(
                  AllTypes.Pick()
                      .FromAssembly(Assembly.GetExecutingAssembly())
                      .BasedOn<MyMarkerInterface>()
                      .WhenInstantiating(instance => // do some stuff with this instance)
                      .Configure(component => component.Startable().LifeStyle.Singleton)
                      .WithService.Base());

В настоящее время мы используем IStartable .Поскольку код «Старт» (т. Е. Пользовательская обработка) идентичен, было бы неплохо удалить эту логику из каждого класса.

Спасибо!Brian

1 Ответ

5 голосов
/ 22 марта 2010

Вы имеете в виду что-то вроде OnCreate метода?

    container.Register(
              AllTypes.FromAssembly(Assembly.GetExecutingAssembly())
                  .BasedOn<MyMarkerInterface>()
                  .WithService.Base()
                  .OnCreate((kernel, instance) => instance.CreatedAt = DateTime.Now)
);

Синглтон - это стиль жизни по умолчанию, поэтому вам не нужно указывать это явно.

Обратите внимание, что здесь поведение немного отличается от того, как работает средство Startable.

  • когда компонент запускается, он создается и запускается самим контейнером как можно скорее (когда становятся доступны все его необходимые зависимости).
  • OnCreate вызывается до того, как ваш компонент возвращается из контейнера, но он не создает его предварительно. Так что если вы никогда не потяните этот компонент, его OnCreate не будет вызываться.

Кроме того, в то время как документы заявляют, что OnCreate живет в учреждении, это больше не так (да, нам нужно обновить документы). Этот метод будет работать из коробки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...