【问题标题】:Is WindsorContainers AddChildContainer really this bad?WindsorContainers AddChildContainer 真的这么糟糕吗?
【发布时间】:2013-02-21 13:57:06
【问题描述】:

我正在尝试从一组基本注册中分支一些子容器,以便于进行不同的配置设置。

我认为基于Mark Seemanns reply on how child containers work,我可以使用子容器来覆盖基本注册中的特定组件。但是,我似乎不像 Seemann 所说的那样工作。

根据 Mark 这应该可以工作:

[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 真的无法以优雅的方式处理这种类型的配置吗?

【问题讨论】:

    标签: castle-windsor ioc-container


    【解决方案1】:

    您所指的行为曾经在旧温莎版本中有效,但在较新的版本中有所改变。

    基本上这是一个错误,它将允许子容器中的组件在其范围之外可见(当组件表单父级依赖子级组件时)

    因此,允许依赖项从子项 --> 父项开始,但反之则不行。

    【讨论】:

    • 我看到了你关于这个主题的博客文章,从我的测试中可以得出结论,温莎确实像你说的那样行事......我只需要确定,我没有错过了什么。 :-( 我真的希望这个错误能尽快被删除。但感谢您的快速回复
    • 明确地说,错误是 Mark 解释的旧行为。您所观察到的在语义上更正确。
    • 语义上我同意,Marks 的例子很丑。但是,如果我可以在父级中省略一些注册(即外部资源的组件)​​并让子容器指定那些缺少的依赖项,那会更好。然后一个孩子可以使用实时组件进行生产,另一个孩子可以使用存根进行集成测试等。(我知道需要一些脑力才能优雅地解决父容器中的单例问题)
    • 那么,鉴于新行为,当调用 childContainer.Relolve() 时,如何配置子容器以将 BasicComponent2 注入 RealBusinessComponent?
    猜你喜欢
    • 2016-12-17
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 2011-08-10
    相关资源
    最近更新 更多