领域服务与领域模型中的实体方法
本文关键字:实体 方法 领域模型 服务 | 更新日期: 2023-09-27 18:15:40
我知道域服务和应用程序服务之间的区别。但是不能真正看到域实体和域服务中的方法之间的区别:/
我有一个游戏,有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;
}
}
那么,总结我的问题:哪些方法进入域服务,哪些方法进入域实体?例如,Class1
类,我应该什么时候创建Class1Services
类?
简单解释一下我选择DDD
的原因:我想做一个跨平台的应用我想让每个平台都有一个通用的单层。我之所以选择C#
,是因为有了Xamarin
的帮助,我可以很容易地实现单领域模型甚至每个平台的服务。我只是被困在决定什么方法应该去服务和什么作为实体的一部分在Domain Model
如果要完成一个用例,您需要在域级别协调2个或更多的聚合,您可以将协调逻辑放在调用聚合方法的域服务中。如果只需要一个聚合,则不涉及域服务。
如果一个方法在逻辑上属于一个实体,把它放在那里。如果没有任何实体使该方法有意义,则将其放在(无状态的)域服务中。
例如,移动玩家的方法应该在玩家实体上——把它放在那里感觉很自然,因为它修改了特定的玩家。
另一方面,计算两个玩家的分数差的方法可以作为域服务来实现。