模拟Castle Windsor的“Per Graph”生活方式

时间:2012-05-28 23:01:33

标签: castle-windsor windsor-3.0

我正在尝试模拟Windsor中的“Per Graph”生活方式,以便以正确的方式解析我的对象。我尝试过Bound生活方式但没有任何成功,可能是由于缺乏关于这个主题的知识。 我需要的是在以下示例代码中表达的:

class Program
{
    static void Main( string[] args )
    {
        var container = new WindsorContainer();
        container.Register(
            Component.For<ClassA>().LifestyleBoundTo<ClassC1>(),
            //Component.For<ClassA>().LifestyleBoundTo<ClassC2>(),
            Component.For<ClassB1>().LifeStyle.Transient,
            Component.For<ClassB2>().LifeStyle.Transient,
            Component.For<ClassC1>().LifeStyle.Transient,
            Component.For<ClassC2>().LifeStyle.Transient );

        var c1 = container.Resolve<ClassC1>();
        Assert.AreSame( c1.B1.A, c1.A );

        var c2 = container.Resolve<ClassC2>();
        Assert.AreSame( c2.B2.A, c2.A );

        Assert.AreNotSame( c1.A, c2.A );
    }
}

class ClassA
{
}

class ClassB1
{
    public ClassB1( ClassA a)
    {
        A = a;
    }

    public ClassA A { get; set; }
}

class ClassC1
{
    public ClassC1( ClassA a, ClassB1 b1 )
    {
        A = a;
        B1 = b1;
    }

    public ClassA A { get; set; }
    public ClassB1 B1 { get; set; }
}

class ClassB2
{
    public ClassB2( ClassA a )
    {
        A = a;
    }

    public ClassA A { get; set; }
}

class ClassC2
{
    public ClassC2( ClassA a, ClassB2 b2 )
    {
        A = a;
        B2 = b2;
    }

    public ClassA A { get; set; }
    public ClassB2 B2 { get; set; }
}

}

1 个答案:

答案 0 :(得分:0)

好的,这一切都按预期工作。

您的第一个断言按预期传递。第二个按预期失败,因为你在每个ClassA范围内ClassC1并且第二个解析图中没有该类的实例。