Simulate the "Per Graph" lifestyle in Castle Windsor

473 Views Asked by At

I'm trying to simulate the "Per Graph" lifestyle in Windsor in order to resolve my objects in the correct way. I have tried the Bound lifestyle but without any success, probably due to a lack of knowledge on the subject. What I need is expressed in the following example code:

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

There are 1 best solutions below

2
On

Ok so it all works as expected.

Your first assert passes as expected. The second one fails as expected, since you're scoping ClassA per ClassC1 and there's no instance of that class in the graph for the second resolve.