2009-05-18 5 views
0

Я играл с замком Виндзор в последнее время и понял, что могу использовать его, чтобы вернуть контейнер-подобный объект, который я сейчас использую. До сих пор я только читал информацию о приложении, имеющем только один экземпляр контейнера для каждого приложения. Правильно ли иметь много контейнеров на одно приложение, если эти контейнеры принадлежат к разным уровням?Правильно ли иметь много контейнеров Castle Windsor для каждого приложения, если эти контейнеры принадлежат разным уровням?

Причина, по которой я прошу, заключается в том, что я хотел бы воспользоваться разрешающей способностью Виндзора и конфигурацией XML для моего собственного контейнероподобного объекта. В настоящее время я использую интеграцию Windsor с MonoRail, и было не совсем корректно смешивать компоненты, которые не имеют ничего общего с MonoRail и его контроллером. Мой второй контейнер будет иметь свой собственный файл конфигурации и не будет знать о MonoRail и контейнере, который он использует. Он полностью находится на разных уровнях и в конечном итоге будет зарегистрирован как зависимость для контроллеров MonoRail. Я чувствую, что нужно избегать прохождения экземпляров контейнеров, так что это правильный способ избежать этого?

ответ

2

Лично у меня нет проблем с использованием только одного контейнера. В конце концов, ваши контроллеры MonoRail будут знать только те службы/интерфейсы, которые им нужны, поэтому им не нужно знать о внутренних компонентах других уровней.

Если вы все еще не хотите, чтобы ваши внутренние компоненты так заметны для остальной части приложения, вот несколько идей:

  • Оберните связанные компоненты в facilities. Это упростит настройку ваших внутренних компонентов и сохранит их конфиденциальность.
  • Делегат компонент конкретизации в контейнере типа объекта, используя заводы или subdependencies арбитры (ref1, ref2, ref3)
  • Использование дочерних контейнеров. Я никогда их не пробовал, но похоже, что это может помочь в этой ситуации (см. ref1, ref2, ref3).

Что бы вы ни делали, вы не хочет иметь каждый компонент с доступом контейнера непосредственно. Если что-нибудь, держите его в своем «коде клея».

+0

Спасибо за ссылки. В настоящее время у меня нет компонентов, обращающихся к контейнеру приложения. В настоящее время у меня есть интерфейс для моего пользовательского контейнера, реализация которого завершает экземпляр контейнера Windsor специально для него. Кажется намного проще, чем создание подревертеров, объектов или использование детских контейнеров. Кроме того, у него есть своя конфигурация, и я избегаю обхода экземпляров контейнера. Зачем расширять контейнер приложения при наличии частного экземпляра? –

+0

Я думал, что вы хотите обернуть свой контейнер в Виндзоре, а не наоборот ... –

+0

Нет, мой пользовательский контейнер имел бы экземпляр контейнера Windsor. Тогда мой пользовательский контейнер будет использовать разрешения Виндзора и биты конфигурации XML. Я хотел бы знать, не страшно ли я от этого подхода, вот и все. Нужно ли мне перефразировать мой вопрос, чтобы сделать его более ясным? –

0

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

+0

В чем преимущество наличия детских контейнеров над независимыми контейнерами? Имейте в виду, что в моем случае есть только один экземпляр контейнера в HttpApplication, чтобы разрешить зависимости от контроллера MonoRail. Мой другой экземпляр контейнера будет только когда-либо отображаться в моей пользовательской реализации контейнера. –

0

Возможно, вы можете использовать детские ядра? Но мне не очень нравится идея.