使用Windsor进行IOC图形周期检测

时间:2016-02-16 14:19:46

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

我正在研究一个非常大的程序,它在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,或者Windsor确实检测到了这个问题,我还没有找到它。我的问题是解决这个问题的代码在哪里?我发现很难相信我是唯一有这个问题的人。

1 个答案:

答案 0 :(得分:0)

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