【问题标题】:Domain Services vs Entity Methods in Domain Model领域模型中的领域服务与实体方法
【发布时间】:2015-12-30 03:10:14
【问题描述】:

我知道域和应用程序服务之间的区别。但是实在看不出领域实体和领域服务中的方法有什么区别:/

我有一个游戏,它有StatePlayers 等。它也有像AddPlayerMoveLeftJump 这样的方法。这些方法去哪儿了?我应该只创建带有属性的裸KOGame,然后创建带有功能的KOGameServices

鲍勃叔叔在他的文章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中实体的一部分时遇到了困难

【问题讨论】:

  • 洋葱架构、DDD、域服务、应用程序服务...对于视频游戏的架构?我认为你走错路了。
  • @jlvaquero +1,对于一些慢节奏、基于浏览器的游戏,它可能是一个选择,但在这里它看起来像是一个实时游戏,所以我绝对同意 DDD 不适合。
  • @jlvaquero 好的,但问题是:哪些方法用于域服务,哪些方法用于域实体?例如 Class1 类,我应该什么时候创建 Class1Services 类?
  • @guillaume31 不知道“实时游戏”是什么意思?但它会是一个手机游戏,就像国际象棋、四连环,更像是“回合制游戏”。我想使用 C#(通过 Xamarin)并为所有平台编写单一模型。所以我的观点是我想拥有共同的 dll,共同的域——那是因为我想使用 Onion Architecture。
  • @guillaume31 我说的是玩家与棋盘互动比他们自己更多的游戏。像国际象棋、四连线、井字游戏等。所以Game 对象有BoardList&lt;Player&gt;GameState 等。我想创建这样的游戏跨平台,所以洋葱拱。是我的第一选择。理论上,在我之前提到的游戏中,在单人模式下——有一点点AI。你会推荐我什么架构?或者至少是我的研究方向?

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


【解决方案1】:

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

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

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

【讨论】:

  • 但是域实体和域服务应该处于同一级别,对吧?只是不同的班级? (例如,在 Visual Studio 中 - 两者都应该在同一个项目中 MyApp.Domain,对吧?
  • 是的,都属于领域模型
【解决方案2】:

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

【讨论】:

  • 一个问题,你为什么把entity改为aggregate
  • 因为在 DDD 中,您应该拥有可能是一个或多个需要一致的实体的聚合,而聚合就是术语。
  • @AntwanReno 我建议你多阅读一下 DDD,尤其是蓝色或红色的书是 IMO 必读的。域服务是它们涵盖的基础知识之一。
  • 我同意 guillaume31。请记住,DDD 和 Onion 架构并不相同。
猜你喜欢
  • 2012-02-04
  • 2010-12-20
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2011-07-16
相关资源
最近更新 更多