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

本文关键字:实体 方法 领域模型 服务 | 更新日期: 2023-09-27 18:15:40

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

我有一个游戏,有State, Players等。还有AddPlayerMoveLeftJump等方法。这些方法都去了哪里?我应该创建裸KOGame只有属性,然后KOGameServices与功能?

Bob叔叔在他的文章中写道:"一个实体可以是一个带有方法的对象,也可以是一组数据结构和函数。"

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

这是我的班级:

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类,我应该什么时候创建Class1Services类?

编辑:

简单解释一下我选择DDD的原因:我想做一个跨平台的应用我想让每个平台都有一个通用的单层。我之所以选择C#,是因为有了Xamarin的帮助,我可以很容易地实现单领域模型甚至每个平台的服务。我只是被困在决定什么方法应该去服务和什么作为实体的一部分在Domain Model

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

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

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

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

另一方面,计算两个玩家的分数差的方法可以作为域服务来实现。