首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环“接口”依赖关系和Castle-Windsor

循环“接口”依赖关系和Castle-Windsor
EN

Stack Overflow用户
提问于 2010-03-18 00:13:50
回答 1查看 1.8K关注 0票数 3

我有一些组件:

代码语言:javascript
复制
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配置:

代码语言:javascript
复制
Container.AddComponent("IFoo", typeof (IFoo), typeof (Foo));
Container.AddComponent("IBar", typeof (IBar), typeof (Bar));

和失败的单元测试:

代码语言:javascript
复制
[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以正确初始化这两个组件?

我可以手动正确地初始化这两个组件:

代码语言:javascript
复制
[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进行这样的配置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-18 00:56:48

一般来说,像这样的循环引用是一个糟糕的想法™,Windsor不能解决它们,所以这一部分你必须手动完成:

代码语言:javascript
复制
        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);

然而,真正需要这种循环性的情况并不常见。你可能想要修改你的设计。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2463895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档