2009-11-06 3 views
3

Я только начинаю с Виндзора, поэтому, пожалуйста, будьте осторожны :) У меня есть сценарий, где я хочу, чтобы иметь возможность переопределять/заменять компоненты, размещенные внутри контейнера Windsor. Читайте дальше ...Как я могу переопределить компонент, зарегистрированный в Castle Windsor?

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

container.Register(Component.For<LoggerBase>().ImplementedBy<DebugLogger>()); 

и

container.Resolve<LoggerBase>(); 

В моих тестах, я хотел бы добавить незавершенная/макет реализации переопределить реализацию «DebugLogger», так что, когда мой прод код вызывает container.Resolve<LoggerBase>(); его получает переопределенную реализацию.

Любые указатели приветствуются!

+0

В версии 3 теперь используется элемент 'IsDefault', позволяющий решить эту проблему. http://stackoverflow.com/questions/9253388/in-castle-windsor-3-override-an-existing-component-registration/9254043#9254043 –

ответ

3

Вместо того, чтобы преследовать этот путь, вы должны использовать разные экземпляры контейнера для разных сценариев. Каждый экземпляр может быть настроен по-разному. В этом весь смысл контейнера DI.

Однако, в целом DI Containers should not be used for unit testing.

+0

Марк, спасибо за это предложение, я не думал об этом. Единственный недостаток, который я предполагаю, заключается в том, что у меня есть большое количество регистраций в контейнере, и вы хотите переопределить один компонент. Однако это дает хорошее решение - еще раз спасибо! –

+0

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

Смежные вопросы