我正在尝试从一组基本注册中分支出许多子容器,以方便进行不同的配置设置。
我基于Mark Seemanns reply on how child containers work认为可以使用子容器来覆盖基本注册中的特定组件。但是我似乎并不像Seemann所说的那样工作。
根据马克的说法,这应该起作用:
[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
}
但是,所有依赖关系显然都是从父级解决的。
如果我从parentContainer中删除IBasicComponent注册,由于缺少注册,我什至无法解决依赖性。
谁能解释您如何使容器按照Seemann的要求行事,还是WindsorContainer真的无法以优雅的方式处理这种类型的配置?
最佳答案
您所指的行为曾经在旧的Windsor版本中起作用,但在较新的版本中已更改。
基本上,这是一个错误,它将允许子容器中的组件在其作用域之外可见(当父组件形式的组件依赖子容器中的组件时)
因此,允许依赖项从子级->父级开始,但不允许相反。