我的代码中有循环依赖项,我不确定如何解决。

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

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);
            }
       // ...
    }

最佳答案

使用接口将控制器的模型与具体的controllerService分开。

这是关于域驱动设计中的项目引用的,我早些时候写了一个有关此问题的小博客:

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

10-08 03:59