依赖注入来解决循环依赖
例:
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的一部分建模成事件可能会切割圆. 然而,我本来就选择了反模式的气味,因为有一些角落(特别是当你处理外部定义的API)时,不能避免循环依赖. 在这种情况下,您需要确定稍微放松依赖项创建的位置.一旦你知道,注入一个Abstract Factory可能有助于推迟一个创作,直到创建了圆的其他部分. 这个other answer是我现在最了解的最好的例子,但如果我可能这么大胆,我即将出版的书还将包含一个解决这个问题的部分. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |