【问题标题】:IOC Graph Cycle Detection with Windsor使用 Windsor 进行 IOC 图形周期检测
【发布时间】:2016-02-16 14:19:45
【问题描述】:

我正在开发一个非常大的程序,该程序在 IOC 容器中包含 100 多个项目(我们使用 Castle Windsor 作为容器)。我错误地在图中为容器创建了一个循环。我解决了这个问题,现在我正在尝试创建一个单元测试,以便将来检测到这个问题。我决定在图表中使用深度优先搜索来查找循环。下面的简化程序会产生同样的问题:

public class Class1
{
    public Class3 Object3
    {
        get;
        set;
    }
}
public class Class2
{
    public Class1 Object1
    {
        get;
        set;
    }
}
public class Class3
{
    public Class2 Object2
    {
        get;
        set;
    }
}
public static void Main(string[] args)
{
    var container = new WindsorContainer();
    container.Register(
        Component.For<Class1>().ImplementedBy<Class1>(),
        Component.For<Class2>().ImplementedBy<Class2>(),
        Component.For<Class3>().ImplementedBy<Class3>());

    var object1 = container.Resolve<Class1>();

    Debug.Assert(object1.Object3 != null);
    Debug.Assert(object1.Object3.Object2 != null);
    Debug.Assert(object1.Object3.Object2.Object1 != null);//fail
}

我认为这是一个常见问题。但是,经过几个小时的研究,我没有发现 Windsor 或其他任何有此问题的人,也没有发现任何可以检测到此问题的代码。我强烈怀疑有人已经在图书馆中针对这个问题创建了一个特定于温莎的解决方案,或者温莎确实检测到了这个问题,但我还没有找到它。我的问题是解决这个问题的代码在哪里?我很难相信我是唯一遇到这个问题的人。

【问题讨论】:

    标签: c# unit-testing inversion-of-control castle-windsor


    【解决方案1】:

    请参阅this question 及其答案。因为您使用的是属性注入,所以循环非常好,因为它们只是在创建所有对象后设置。如果你使用了构造函数注入(你肯定应该使用它),那么只要检测到一个循环,你就会得到一个运行时异常,它会包含你需要修复它的所有细节。

    【讨论】:

    • 感谢您的链接,它确实为其他人如何解决此问题提供了一些启示。在该链接中,Mark Seemann 表示循环引用通常是设计缺陷的标志,我倾向于同意,因为如果管理不当,它可能会导致无限循环。我还希望避免运行时错误,因为可以在单元测试中检测到此类问题。但再次感谢您的建议。
    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多