【问题标题】:Resolving Circular Dependency with a Library Class使用库类解决循环依赖
【发布时间】:2016-08-21 16:50:37
【问题描述】:

在我当前的项目中,我有想要在环境中移动的 Actor。不同的Actor可能有不同的运动策略,我将这些策略作为依赖注入到Actor中,如下所示(与语言无关):

actor = new Actor(new Strategy());

但是,策略需要能够根据 Actor 的状态(例如其当前位置、健康状况等)做出决策。因此,需要将 Actor 注入到 Strategy 中,这显然是一个糟糕的设计,因为它是循环依赖。

在阅读this article 之后,我尝试从 Actor 中提取一些状态信息到一个名为 State 的新类中,现在有一个如下所示的依赖模型:

state = new State();
strategy = new Strategy(state);
actor = new Actor(state, strategy);

这消除了循环依赖。然而,在我的项目中,Actor 派生自一个已经具有状态信息(位置、健康状况等)的库类。因此,当 Actor 已经拥有该职责时,提取第三个 State 类实际上没有任何意义。 State 所做的就是从 Actor 那里获取状态,所以在最坏的情况下它们仍然是循环依赖的,或者在最好的情况下它们是强耦合的。

处理这种情况的最佳方法是什么?最后,我尝试将运动策略注入到 Actors 中,这些策略需要知道一些状态信息才能做出明智的决策,并且 Actor 扩展了一个包含状态的库类。

【问题讨论】:

    标签: dependency-injection language-agnostic circular-dependency


    【解决方案1】:

    策略并不是任何特定 Actor 明确拥有的东西。应该是一个以Actor为方法参数的单例。

    在 C# 中,这允许您充分实现 MEF。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 2020-11-12
      • 2018-08-24
      • 2013-04-23
      相关资源
      最近更新 更多