2015-08-25 2 views
3

Я хотел бы быть в состоянии осуществить это в моем Виндзорском замке контейнере установить:Виндзорского замок Эквивалент IStartable Autofac в

«Для всех типов, реализующих IStartable в текущей сборке зарегистрировать их и запустить метод Start для их."

Аналогично тому, как вы можете использовать Autofac для таких вещей, как регистрация сопоставлений Automapper. например

public class MyBlahViewModelMapper : IStartable 
{ 
    public void Start() 
    { 
     Mapper.CreateMap<MyBlahEntity, MyBlahViewModel>(); 
    } 
} 

Autofac делает это автоматически .... Я думаю, что Виндзор не может помочь мне здесь?

+0

Я думаю, что я ищу способ разделить все мои определения Automapper ..... мой enviro использует замок Виндзор как контейнер IOC. –

ответ

3

Windsor имеет собственный интерфейс IStartable. Если вы хотите, чтобы Windsor регистрировал ваши объекты и создавал/запускал их сразу же после этого, для этого вы должны использовать Startable Facility.

Чтобы уточнить, есть два понятия здесь:

  1. IStartable интерфейс, который обеспечивает Start и Stop методы. Это жизненный цикл интерфейсы, которые обеспечивают жизненный цикл обратных вызовов: Start вызываются сразу после того, экземпляр компоненты получает создан (после того, как работает конструктор)

  2. загрузочной Facility, которая заставляет ваши IStartable компонент быть созданы и начали сразу же после того, как монтажник побежали.

Вот что код будет выглядеть следующим образом:

container.AddFacility<StartableFacility>(f => f.DeferredStart()); 
container.Install(FromAssembly.This()); 
// by here all startable are started 

Если вы на Windsor 3.3 или более поздней версии вы также можете вручную запустить в startables, чтобы начать (что полезно, если вам нужно сделать некоторые дополнительная настройка для них)

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 
+0

Это для пожизненного управления разрешенными компонентами; Я не считаю, что это та же роль, что и интерфейс Autofact. – user2864740

+1

Нет, это не так. Поверь мне, я написал это. –

+0

благодарит @KrzysztofKozmic, поэтому Startable Facility будет эквивалентно IStartable в autofac и позволит мне запустить метод «start» для n числа классов, реализующих общий интерфейс? –

0

Ближайшие: Castle Windows Installers - они могут тривиально сканироваться с сборки и устанавливать (или «запускать»). Установщики обычно используются для регистрации компонентов, но их также можно использовать для другой инициализации.

Windsor использует монтажник (то есть типы, реализующие интерфейс IWindsorInstaller) для инкапсуляции и перегородочного регистрационной логику .. FromAssembly [делает] работаю с установщиками ветер.

После создания установки использования одного из текучих конфигураций в главном IoC начальной загрузки, например:

container.Install(
    FromAssembly.This()); 

Следует отметить, что порядок не определен; инсталляторы, которые должны выполняться в заказе, должны быть указаны с явным порядком установки, возможно, через модифицированный отражатель сборки.

+0

Спасибо за ввод .... Я использую инсталляторы ... не знаю, как они помогут мне вызвать метод start на 'n' классах, которые реализуют определенный интерфейс. –

+0

@AndrewDuffy Реализуйте n-классы с интерфейсом IWindsorInstaller и внедрить метод установки. Забудьте, что он называется «Install», а не «Start».Если это невозможно/не требуется использовать интерфейс IWindsorInstaller, тогда не существует «встроенного» способа сделать это, но это может быть сделано - и все еще в Castle Windsor - путем регистрации нескольких типов IMyStartable (например.) И использования 'ResolveAll < IMyStartable> 'и вызывать метод« Пуск »по очереди. Замок Виндзор может, конечно, зарегистрировать все компоненты для данного интерфейса через его свободный от отражения API. – user2864740

+0

Для этой цели, вероятно, также возможно повторно использовать части свободного API (или проверить исходный код) .. но два описанных выше метода работают «внутри» встроенных объектов Castle Window. – user2864740