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; }
}
}
Ok so it all works as expected.
Your first assert passes as expected. The second one fails as expected, since you're scoping
ClassA
perClassC1
and there's no instance of that class in the graph for the second resolve.