【问题标题】:Resolving circular dependencies with dependency injection [closed]使用依赖注入解决循环依赖
【发布时间】:2010-11-29 21:01:33
【问题描述】:

我在各种网站上看到了几篇文章,它们建议使用依赖注入来解决 .NET 程序集之间的循环依赖关系。这可能会解决构建错误,但它并没有真正解决循环依赖,是吗?对我来说,架构中似乎仍然存在逻辑错误。我疯了还是别人同意?

  1. 这是对 DI 的不太出色的使用吗?
  2. 不是解决循环依赖问题的合适方法?

【问题讨论】:

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


【解决方案1】:

我将在这里折腾我的 0.02 美元,因为我通过搜索“删除周期性依赖项”发现了这篇有用的帖子

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

因此,通过 IoC 投票支持 ctor 注入,因为它会为您发现循环依赖关系。然后由您来重构和删除架构错误。

【讨论】:

【解决方案2】:
  1. 是的,您通过使用额外的抽象层使检测它们变得更加困难。
  2. 您绝对不会解决循环依赖,而是通过添加额外的抽象层、使用后期边界或/和松散耦合来隐藏它。

以下帖子(我将添加以供参考)中返回相同的答案,即创建一个两者都依赖的第三类。这意味着:您违反了单一职责原则。通过在一个单独的类中移动(提取)两个类所依赖的责任,您将移除循环依赖。

仅供参考Single Responsibility Pattern on Wikipedia

其他人的 StackOverflow 讨论:

StackOverflow 上的My answer 带有在单独的类中提取责任的示例。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • +1 很棒的链接 - 那篇文章解释得很好!
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2020-11-12
      相关资源
      最近更新 更多