1

我有一个命令:MovePlayerCommand。

此命令的验证器之一做了 3 件事:

  • 计算玩家移动的成本(可以调用以进行验证,也可以用于显示目的)

  • 验证这个成本

  • 收听“PlayerMoved”事件,以便我们可以应用成本(例如 - 10 个行动点)。

这对一个班级来说责任太多了吗?如果是这样,您将如何区分它?

编辑:我知道删除成本并检查它是两件事,但我无法将它们与成本的计算分开,而且我不想为每个 Action 设置 3 个类

4

2 回答 2

1

没有更多信息,无法明确回答。

也就是说,您所描述的听起来不像是验证器;这听起来像是某种“计算器”。

计算方法很可能属于一个类(计算器类),然后验证器类将引用计算器。

我倾向于在一个非常薄的处理程序类中处理域事件,然后该处理程序类遵循聚合根或服务(这是一种常见但不普遍的做法)。因此,根或服务可能还会引用计算器(可能还有验证器)。

这个问题对于 SO 来说可能过于宽泛,在 DDD 论坛上可能会得到更好的回答。即使这样,您也可能需要提供更多背景信息。

于 2013-04-10T22:00:31.270 回答
1

这里有一个很大的误解,因为一些发表评论的人似乎混合了 DDD 和 CQRS。OP 正在谈论命令并用 cqrs 标记了这个问题,所以我假设 OP 确实在使用带有 CQRS 的 DDD。

域验证逻辑应该在命令处理程序中,您可以并且确实应该在命令命中处理程序存根之前进行数据检查,但不进行任何域逻辑验证。也就是说,除了在命令处理程序中之外,没有其他地方可以根据域逻辑验证命令,因为那是加载聚合的地方。

您显示的验证是域验证,因此它们实际上应该由您的聚合执行,所以是的,我认为您应该稍微打破这个责任,并拆分不同类型的验证:数据和域。

于 2013-04-16T13:39:31.287 回答