Виндзорский замок - эквивалент автофака
Я хотел бы иметь возможность реализовать это в моей настройке контейнера Виндзорского замка:
"Для всех типов, которые реализуют IStartable в текущей сборке, зарегистрируйте их и запустите для них метод Start".
Подобно тому, что вы можете сделать, используя Autofac для таких вещей, как регистрация сопоставлений Automapper. например
public class MyBlahViewModelMapper : IStartable
{
public void Start()
{
Mapper.CreateMap<MyBlahEntity, MyBlahViewModel>();
}
}
Autofac делает это автоматически.... Я думаю, что Виндзор не может помочь мне здесь?
2 ответа
У Виндзора есть свой IStartable
интерфейс. Если вы хотите, чтобы Windsor зарегистрировал ваши объекты и сразу же после этого создал / запустил их, для этого вы использовали бы Startable Facility.
Чтобы уточнить, здесь есть две концепции:
IStartable
интерфейс, который обеспечиваетStart
а такжеStop
методы. Это интерфейсы жизненного цикла, которые обеспечивают обратные вызовы жизненного цикла:Start
вызывается сразу после создания экземпляра компонента (после запуска конструктора)Запускаемый объект, который заставляет ваш
IStartable
компоненты, которые будут созданы и запущены сразу после запуска установщиков.
Вот как будет выглядеть код:
container.AddFacility<StartableFacility>(f => f.DeferredStart());
container.Install(FromAssembly.This());
// by here all startable are started
Если вы используете Windsor 3.3 или более позднюю версию, вы также можете вручную запустить стартовые таблицы (что полезно, если вам нужно выполнить некоторые дополнительные настройки для них)
var flag = new StartFlag();
container.AddFacility<StartableFacility>(f => f.DeferredStart(flag));
container.Install(FromAssembly.This());
// do whatever else set up your app needs
// when ready, signal the flag
flag.Signal();
// by here all startable are started
Самым близким являются установщики Castle Windows - их можно легко отсканировать из сборки и установить (или "запустить"). Установщики обычно используются для регистрации компонентов, но их можно использовать и для другой инициализации.
Windsor использует инсталляторы (то есть типы, реализующие интерфейс IWindsorInstaller) для инкапсуляции и разбиения вашей логики регистрации. FromAssembly [делает] работать с инсталляторами на одном дыхании.
После создания установщика используйте одну из свободно используемых конфигураций в основном загрузчике IoC, например:
container.Install(
FromAssembly.This());
Обратите внимание, что порядок не указан; Установщики, которые должны встречаться в порядке, должны быть указаны с явным порядком установки, возможно, через модифицированный рефлектор сборки.