C#:如何解决这种循环依赖?

标签 c# design-patterns

我的代码中存在循环依赖,我不确定如何解决它。

我正在开发一款游戏。 NPC 具有三个组成部分,分别负责思考、感知和行动。这些组件需要访问 NPC Controller 才能访问其模型,但 Controller 需要这些组件才能执行任何操作。因此,两者都将彼此作为构造函数中的参数。

ISenseNPC sense = new DefaultSenseNPC(controller, worldQueryEngine);
IThinkNPC think = new DefaultThinkNPC(sense);
IActNPC act = new DefaultActNPC(combatEngine, sense, controller);
controller = new ControllerNPC(act, think);

(上面的例子对参数做了一些简化。)

没有 actthinkcontroller 不能做任何事情,所以我不想让它在没有它们的情况下被初始化.反之亦然。我该怎么办?

ControllerNPC 使用thinkact 来更新它在世界中的状态:

public class ControllerNPC {
   // ...
           public override void Update(long tick)
        {
            // ...
            act.UpdateFromBehavior(CurrentBehavior, tick);

            CurrentBehavior = think.TransitionState(CurrentBehavior, tick);
        }
   // ...

}

DefaultSenseNPC 使用 controller 来确定它是否与任何东西发生碰撞:

 public class DefaultSenseNPC {
       // ...
            public bool IsCollidingWithTarget()
            {
                return worldQuery.IsColliding(controller, model.Target);
            }
       // ...
    }

最佳答案

使用接口(interface)将 Controller 的模型与具体的 Controller 服务分开。

这是关于领域驱动设计中的项目引用,我前段时间写了一篇关于这个问题的小博客:

http://www.mellekoning.nl/index.php/2010/03/11/project-references-in-ddd/

关于C#:如何解决这种循环依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2663871/

相关文章:

c# - 通过 TemplateSelector 在 DataTemplate 中进行双向数据绑定(bind)

c# - 在 C#/WPF 中获取 PathGeometry(线)的长度

c# - 在 visual studio 中自动生成部分类的扩展

design-patterns - 使用 RX 通过中介在两个组件之间进行通信

design-patterns - JavaScript 模式 : referencing "this" inside private and public functions

c# - 如何在具有负值的 Chart.js 中的 Yaxis 上隐藏 0 值

Levenberg–Marquardt 算法的 C# 实现

design-patterns - Abstract Factory & Façade,协同设计模式

.net - .NET Framework 中是否使用了任何设计模式?

oop - 使用面向对象的分析和设计对电梯进行建模