我想出了一些解决方案,我的IoC / DI容器( Castle Windsor )声称存在循环依赖树。这是真的。但我不确定这个循环是否有害。
这或多或少是依赖树:
(1)域事件管理器是一个通用类,旨在协调由相同或其他域监听的具体域事件并执行辅助操作。 功能
(2)这是依赖循环发生的地方
我的域事件管理和处理是在考虑面向方面的编程的情况下实现的,因此,虽然它是依赖树的一部分,但给定的域事件处理程序可能依赖于或不依赖于服务。相同的依赖树:我认为域事件处理程序就像一个额外的顶级依赖项。但最坏的情况已经发生了。
我的观点是,由于域事件是一个交叉概念,给定的处理程序应该能够注入任何服务,甚至是已经在给定操作的依赖关系树中的某个服务流动。
目前,我已在受影响的域事件处理程序中使用属性注入修复了此问题,但无论如何可能有替代整个解决方法。
答案 0 :(得分:4)
从您的设计的抽象定义中很难准确,但我发现大多数情况下的循环依赖是Single Responsibility Principle违规的结果。
问问自己:可以通过将服务A 分解为多个较小的独立组件来解决问题,其中:
如果该问题的答案是:是的,服务A 很可能太大,并承担了太多责任。
这些问题通常与Interface Segregation Principle密切相关,因为您最终会使用更集中的API来构建更小的组件。这些组件通常只有一种公共方法。
本书Dependency Injection in .NET, second edition的第6章详细介绍了依赖循环,它们是由SRP违规引起的。