我有一些组件:
public interface IFoo
{ }
public interface IBar
{ }
public class Foo : IFoo
{
public IBar Bar { get; set; }
}
public class Bar : IBar
{
public IFoo Foo { get; set; }
}我有Castle-Windsor配置:
Container.AddComponent("IFoo", typeof (IFoo), typeof (Foo));
Container.AddComponent("IBar", typeof (IBar), typeof (Bar));和失败的单元测试:
[Test]
public void FooBarTest()
{
var container = ObjFactory.Container;
var foo = container.Resolve<IFoo>();
var bar = container.Resolve<IBar>();
Assert.IsNotNull(((Foo) foo).Bar);
Assert.IsNotNull(((Bar) bar).Foo);
}失败,因为循环依赖,"foo".Bar或"bar".Foo为空。如何配置Castle以正确初始化这两个组件?
我可以手动正确地初始化这两个组件:
[Test]
public void FooBarTManualest()
{
var fooObj = new Foo();
var barObj = new Bar();
fooObj.Bar = barObj;
barObj.Foo = fooObj;
var foo = (IFoo) fooObj;
var bar = (IBar) barObj;
Assert.IsNotNull(((Foo)foo).Bar);
Assert.IsNotNull(((Bar)bar).Foo);
}。。它成功了,通过了。如何使用Castle Windsor进行这样的配置?
发布于 2010-03-18 00:56:48
一般来说,像这样的循环引用是一个糟糕的想法™,Windsor不能解决它们,所以这一部分你必须手动完成:
var container = new WindsorContainer();
container.Register(Component.For<IFoo>().ImplementedBy<Foo>()
.OnCreate((k, f) =>
{
var other = k.Resolve<IBar>() as Bar;
((Foo)f).Bar = other;
other.Foo = f;
}),
Component.For<IBar>().ImplementedBy<Bar>());
var foo = container.Resolve<IFoo>() as Foo;
var bar = container.Resolve<IBar>() as Bar;
Debug.Assert(bar.Foo != null);
Debug.Assert(foo.Bar != null);
Debug.Assert((foo.Bar as Bar).Foo == foo);
Debug.Assert((bar.Foo as Foo).Bar == bar);然而,真正需要这种循环性的情况并不常见。你可能想要修改你的设计。
https://stackoverflow.com/questions/2463895
复制相似问题