我知道域和应用程序服务之间的区别。但是,无法真正看到域实体和域服务中方法之间的区别:/
我有一个游戏,有State
,Players
等。它还有AddPlayer
,MoveLeft
,Jump
等方法。这些方法去哪儿了?我应该创建仅包含属性的裸KOGame
,然后创建具有功能的KOGameServices
?
Bob叔叔在他的文章here中写道"一个实体可以是一个带有方法的对象,或者它可以是一组数据结构和函数。"
我甚至不想提及像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;
}
}
所以,结束我的问题:域服务有哪些方法,域实体有哪些方法?例如Class1
类,何时应该创建Class1Services
类?
修改
快速解释一下我选择DDD
的原因:
我想创建跨平台应用程序,我希望每个平台都有单层通用。我选择C#
,在Xamarin
的帮助下,我可以轻松地为每个平台实现单域模型甚至服务。我只是坚持决定哪些方法应该用于服务以及作为Domain Model
答案 0 :(得分:7)
如果要完成一个用例,您需要在域级别协调2个或更多聚合,将协调逻辑放在域服务中调用聚合方法。如果只需要一个聚合,则不涉及域服务。只需从应用服务调用聚合方法。
答案 1 :(得分:5)
如果某个方法在逻辑上属于某个实体,请将其放在那里。如果该方法没有意义的任何实体,请将其置于(无状态!)域服务中。
例如,一个移动玩家的方法应该在玩家实体上 - 将它放在那里感觉很自然,因为它修改了特定的玩家。
另一方面,一种方法,例如,计算两个玩家的得分差异可以实现为域名服务。