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

Ant*_*eno 7 .net c# architecture domain-driven-design

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

我有一个游戏,有State,Players等等.它也有方法,比如AddPlayer,MoveLeft,Jump.这些方法去哪儿了?我应该KOGame仅使用属性创建裸体,然后KOGameServices使用功能吗?

Bob大叔在他的文章在这里写了"一个实体可以与方法的对象,也可以是一组数据结构和功能."

我甚至不想提,类似的方法Move或Jump 将要成为也在应用服务,在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,结束我的问题:域服务有哪些方法,域实体有哪些方法?举个例子Class1类,什么时候应该创建Class1Services类?

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

jlv*_*ero 7

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


the*_*Dmi 5

如果某个方法在逻辑上属于某个实体,请将其放在那里.如果没有任何该方法有意义的实体,请将其置于(无状态!)域服务中.

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

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