域模型中的域服务与实体方法

Domain Services vs Entity Methods in Domain Model

我知道域服务和应用程序服务之间的区别。但是无法真正看出域实体和域服务中的方法之间的区别:/

我有一个游戏,有StatePlayers等。还有AddPlayerMoveLeftJump等方法。这些方法去哪儿了?我应该创建仅具有属性的裸 KOGame,然后创建具有功能的 KOGameServices 吗?

Bob 叔叔在他的文章 here 中写道 "An entity can be an object with methods, or it can be a set of data structures and functions."

我什至不想提及像 MoveJump 这样的方法 也必须在应用程序服务中,在 KOGameAPI - 因为 UI 需要这些方法(当然是通过接口)。

这是我的 class:

public class KOGame
{
    public GameState State { get; set; }
    public IList<Player> Players { get; set; }
    public int PlayersCount;

    public KOGame()
    {
        State = GameState.New;
        PlayersCount = 2;
        Players = new List<Player>();
    }

    public void AddPlayer(Player player)
    {
    }

    public bool MoveRight(int id)
    {
        return false;
    }

    public bool MoveLeft(int id)
    {
        return false;
    }

    public bool Jump(int id)
    {
        return false;
    }
}

那么,结束我的问题:哪些方法适用于域服务,哪些方法适用于域实体?例如 Class1 class,我应该什么时候创建 Class1Services class?

编辑: 简单解释一下为什么我选择 DDD: 我想创建跨平台应用程序,我希望每个平台都有一个通用的单层。我选择 C#,因为在 Xamarin 的帮助下,我可以轻松地为每个平台实现单域模型甚至服务。我只是在决定什么方法应该进入服务以及什么作为 Domain Model

中实体的一部分

如果要完成一个用例,您需要在域级别协调 2 个或更多聚合,您可以将协调逻辑放在调用聚合方法的域服务中。如果只需要一个聚合,则不涉及域服务。只需从应用服务调用聚合方法。

如果一个方法在逻辑上属于一个实体,就把它放在那里。如果没有任何实体使该方法有意义,请将其放入(无状态!)域服务中。

例如,移动玩家的方法应该在玩家实体上 - 将它放在那里感觉很自然,因为它修改了特定玩家

另一方面,一种方法,例如计算两个玩家的得分差异可以作为域服务实现。