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

时间:2015-10-01 23:06:11

标签: c# .net architecture domain-driven-design

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

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

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

我甚至不想提及像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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

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

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

相关问题