Я пытаюсь разветвить несколько дочерних контейнеров из базового набора регистраций, чтобы облегчить различные настройки конфигурации.Действительно ли 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 действительно не может обработать этот тип конфигурации изящным образом?
Я видел ваш блог-пост на эту тему, и из того, что я мог заключить из своих тестов, Виндзор действительно ведет себя так, как вы говорите ... Мне просто нужно было убедиться, что я ничего не пропустил. :-(Я очень надеюсь, что эта ошибка скоро будет удалена, но спасибо за быстрый ответ. – Slind
Чтобы быть ясным, ошибкой было поведение, которое Марк объяснял. То, что вы наблюдаете, семантически, правильнее. –
Семантически Я согласен с тем, что пример Marks очень уродлив. Но было бы неплохо, если бы я мог опустить некоторые регистрации в родительском (то есть компоненты для внешних ресурсов) и позволить контейнерам-потомкам указать те недостающие зависимости. Тогда один ребенок может быть живые компоненты, еще один ребенок для теста интеграции с заглушками и т. д. (я знаю, что som мозговой толчок понадобится для точного решения проблемы одиночных элементов в родительском контейнере) – Slind