依赖注入以解决循环依赖关系

tan*_*ius 10 refactoring dependency-injection inversion-of-control

例:

class MyClass
{
    Composition m_Composition;

    void MyClass()
    {
        m_Composition = new Composition( this );
    }
}
Run Code Online (Sandbox Code Playgroud)

我有兴趣在这里使用depenency-injection.所以我将不得不重构构造函数,如:

void MyClass( Composition composition )
{
    m_Composition = composition;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ann 12

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

在许多DI容器中,您可以提供高级配置,使您可以克服此问题,但它们本身无法解决循环依赖关系.他们怎么样?

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

  • 使用事件从一个类发信号到另一个类.通常,循环依赖已经主要在一个方向上进行,并且在这种情况下,将此信令API的一部分建模为事件可能会削减圆圈.
  • 如果上述情况属实,但您认为事件似乎有误,可以考虑应用Observer模式.
  • 如果通信必须真正双向进行,则可以使用组件可以通过的介体进行通信.

不过,我刻意的选择了字反模式,因为有其他的情况(特别是当你处理外部定义的API),其中无法避免循环依赖.

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

对方的回答是最好的,可用的例子中我目前知道的,但如果我可以大胆,我即将出版的新书也将包含解决这个问题很一节.