加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

依赖注入来解决循环依赖

发布时间:2020-12-13 20:24:23 所属栏目:百科 来源:网络整理
导读:例: class MyClass{ Composition m_Composition; void MyClass() { m_Composition = new Composition( this ); }} 我有兴趣在这里使用依赖注射.所以我必须重构构造函数,如: void MyClass( Composition composition ){ m_Composition = composition;} 但是
例:
class MyClass
{
    Composition m_Composition;

    void MyClass()
    {
        m_Composition = new Composition( this );
    }
}

我有兴趣在这里使用依赖注射.所以我必须重构构造函数,如:

void MyClass( Composition composition )
{
    m_Composition = composition;
}

但是现在我得到一个问题,因为Composition-object依赖于刚创建的MyClass类型的对象.

依赖关系容器可以解决这个问题吗?应该这样做吗?
还是从一开始就是糟糕的设计?

不,DI容器不会解决循环依赖 – 实际上,当您尝试解析依赖关系时,它将通过抛出异常来抗议它.

在许多DI容器中,您可以提供高级配置,使您能够克服这个问题,但是它们本身不能解决循环依赖关系.他们怎么可能

根据经验,循环遗传是一种设计气味.如果可以的话,考虑一个替代设计,你可以摆脱循环依赖关系 – 这也会减少耦合.一些可能的重新设计备选方案:

>使用事件从一个类到另一个阶段发信号.通常,循环依赖性主要在一个方向进行,并且在这种情况下,将该信令API的一部分建模成事件可能会切割圆.
>如果上述是真的,但是你觉得事件似乎错了,你可以考虑应用Observer模式.
>如果通信必须真正走到两方面,您可以使用组件可以通信的Mediator.

然而,我本来就选择了反模式的气味,因为有一些角落(特别是当你处理外部定义的API)时,不能避免循环依赖.

在这种情况下,您需要确定稍微放松依赖项创建的位置.一旦你知道,注入一个Abstract Factory可能有助于推迟一个创作,直到创建了圆的其他部分.

这个other answer是我现在最了解的最好的例子,但如果我可能这么大胆,我即将出版的书还将包含一个解决这个问题的部分.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读