2013-02-21 4 views
3

Я пытаюсь разветвить несколько дочерних контейнеров из базового набора регистраций, чтобы облегчить различные настройки конфигурации.Действительно ли WindsorContainers AddChildContainer это плохо?

Я думал, что на основе Mark Seemanns reply on how child containers work я могу использовать дочерние контейнеры для переопределения определенных компонентов в базовой регистрации. Однако, похоже, я не работаю, как утверждает Семанн.

Согласно Марку это должно работать:

[TestMethod] 
public void OverrideRegistrationInParentContainer() 
{ 
    //IBusinessComponent depends on IBasicComponent 
    var parentContainer = new WindsorContainer(); 
    parentContainer.Register(Component.For<IBasicComponent>().ImplementedBy<BasicComponent>()); //Returns 42 
    parentContainer.Register(Component.For<IBusinessComponent>().ImplementedBy<RealBusinessComponent>()); //Returns the result of IBasicComponent 


    var childContainer = new WindsorContainer(); 
    childContainer.Register(Component.For<IBasicComponent>().ImplementedBy<BasicComponent2>()); //Returns 40 

    parentContainer.AddChildContainer(childContainer); 

    var service = childContainer.Resolve<IBusinessComponent>(); 
    Assert.AreEqual(40, service.GetBusinessValue()); //This fails with the actual value being 42 
} 

Однако вся зависимость, очевидно, разрешено от родителей.

Если я удалю регистрацию IBasicComponent из родительского Контейнера, я даже не могу разрешить зависимость из-за отсутствия регистрации.

Может ли кто-нибудь объяснить, как вы получите, чтобы контейнер вел себя как требования Seemann, или же WindsorContainer действительно не может обработать этот тип конфигурации изящным образом?

ответ

4

Поведение, о котором вы говорите, использовалось для работы в старых версиях Windsor, но было изменено в более поздних версиях.

В основном это ошибка, и это позволило бы компоненты из детского контейнера, чтобы быть видимыми за его рамки (когда форма компонента родитель принимает зависимость от компонента от ребенка)

Таким образом, зависимости разрешено идти от ребенка -> родителя, но не наоборот.

+0

Я видел ваш блог-пост на эту тему, и из того, что я мог заключить из своих тестов, Виндзор действительно ведет себя так, как вы говорите ... Мне просто нужно было убедиться, что я ничего не пропустил. :-(Я очень надеюсь, что эта ошибка скоро будет удалена, но спасибо за быстрый ответ. – Slind

+1

Чтобы быть ясным, ошибкой было поведение, которое Марк объяснял. То, что вы наблюдаете, семантически, правильнее. –

+1

Семантически Я согласен с тем, что пример Marks очень уродлив. Но было бы неплохо, если бы я мог опустить некоторые регистрации в родительском (то есть компоненты для внешних ресурсов) и позволить контейнерам-потомкам указать те недостающие зависимости. Тогда один ребенок может быть живые компоненты, еще один ребенок для теста интеграции с заглушками и т. д. (я знаю, что som мозговой толчок понадобится для точного решения проблемы одиночных элементов в родительском контейнере) – Slind