循环依赖关系树,是否合理

时间:2017-04-18 12:26:48

标签: c# .net dependency-injection castle-windsor circular-dependency

我想出了一些解决方案,我的IoC / DI容器( Castle Windsor )声称存在循环依赖树。这是真的。但我不确定这个循环是否有害。

这或多或少是依赖树:

  • WebAPI控制器依赖于......
  • ... 服务A 取决于......
  • ......工作单位取决于......
  • ......存储库依赖于......
  • ...域事件管理器(1)取决于很多......
  • ...域事件处理程序,一个依赖于......
  • ... 服务A (2)

(1)域事件管理器是一个通用类,旨在协调由相同或其他域监听的具体域事件并执行辅助操作。 功能

(2)这是依赖循环发生的地方

我的域事件管理和处理是在考虑面向方面的编程的情况下实现的,因此,虽然它是依赖树的一部分,但给定的域事件处理程序可能依赖于或不依赖于服务。相同的依赖树:我认为域事件处理程序就像一个额外的顶级依赖项。但最坏的情况已经发生了。

我的观点是,由于域事件是一个交叉概念,给定的处理程序应该能够注入任何服务,甚至是已经在给定操作的依赖关系树中的某个服务流动。

目前,我已在受影响的域事件处理程序中使用属性注入修复了此问题,但无论如何可能有替代整个解决方法。

1 个答案:

答案 0 :(得分:4)

从您的设计的抽象定义中很难准确,但我发现大多数情况下的循环依赖是Single Responsibility Principle违规的结果。

问问自己:可以通过将服务A 分解为多个较小的独立组件来解决问题,其中:

  • WebAPI控制器依赖于新的服务Y ,它再次依赖于现在拆分服务A 的一个或多个组件。
  • 其中一个域事件处理程序依赖于前一个服务A 的一个隔离组件。

如果该问题的答案是:是的,服务A 很可能太大,并承担了太多责任。

这些问题通常与Interface Segregation Principle密切相关,因为您最终会使用更集中的API来构建更小的组件。这些组件通常只有一种公共方法。

本书Dependency Injection in .NET, second edition的第6章详细介绍了依赖循环,它们是由SRP违规引起的。