使用依赖注入解决循环依赖关系

时间:2009-09-20 13:16:20

标签: .net architecture dependency-injection circular-dependency

我在各种网站上看过几篇文章,提出通过使用依赖注入解决.NET程序集之间的循环依赖关系。这可能会解决构建错误,但它并没有真正解决循环依赖,是吗?对我来说,架构中似乎仍然存在逻辑错误。我是疯了还是其他人都同意1)这是对DI的不太好用,2)不是解决循环依赖问题的合适方法吗?

4 个答案:

答案 0 :(得分:31)

如果两个对象之间存在循环依赖关系,则意味着您需要第三个对象,这两个对象将依赖于该对象,因此它们不会相互依赖。这篇文章是您问题的确切解决方案:

http://misko.hevery.com/2008/08/01/circular-dependency-in-constructors-and-dependency-injection/

答案 1 :(得分:7)

  1. 是的,你通过使用额外的抽象层来更难以检测到它们。
  2. 你绝对不能解决循环依赖,而是通过添加额外的抽象层,使用后期绑定或/和松散耦合来隐藏它。
  3. 相同的答案在以下帖子中返回(我将为参考添加),创建一个依赖于的第三个类。这意味着:您违反单一责任原则。通过移动(提取)责任,这两个类依赖于一个单独的类,你将删除循环依赖。

    仅供参考Single Responsibility Pattern on Wikipedia

    其他人的StackOverflow讨论:

    StackOverflow上的

    My answer以及在单独的类中提取责任的示例。

答案 2 :(得分:3)

DI不是用于循环依赖性解析,而是用于促进创建良好分离的组件,从而更加可测试的组件。

答案 3 :(得分:1)

因为我通过搜索“删除周期性依赖”找到了这篇有用的帖子,所以我会在这里投入0.02美元

是。您可以使用DI来解决循环依赖关系。解决任何问题的第一步是找到它。 Ninject抱怨我的循环依赖,并在引导时抛出一个有用的异常。 Ninject找到了它,并迫使我解决它。我可以欺骗并使用属性注入或方法注入,但这会破坏我对类不变量的保护(我认为你在抱怨)。

所以通过IoC对ctor注入投票,因为它会为你发现循环依赖。然后由您来重构并删除架构错误。