我收到了一个命令:MovePlayerCommand。
此命令的验证程序之一执行3项操作:
计算玩家移动的成本(可以调用验证但也可以用于显示目的)
验证此费用
收听“PlayerMoved”事件,以便我们可以应用费用(例如 - 10个操作点)。
单个班级的责任是否过多?如果是这样,你会如何分开呢?
编辑:我知道删除成本并检查它是两件事,但我不能将它们与这笔费用的计算区分开来,而且我不希望每个动作都有3个类
答案 0 :(得分:1)
在没有更多信息的情况下无法明确回答。
那就是说,你所描述的听起来并不像验证者;它听起来像是各种各样的“计算器”。
计算方法很可能属于一个类(计算器类),然后验证器类将引用计算器。
我倾向于在一个非常薄的处理程序类中处理域事件,然后将其推迟到聚合根或服务(这是一种常见但不普遍的做法)。因此,根或服务可能也会引用计算器(可能还有验证器)。
这个问题对于SO来说可能过于宽泛,在DDD论坛上可能会得到更好的回答。即便如此,您可能需要提供更多背景信息。
答案 1 :(得分:1)
这里存在很大的误解,因为一些人发表评论似乎在混合DDD和CQRS。 OP正在讨论命令,并用cqrs标记了问题,所以我假设OP确实使用DDD和CQRS。
域验证逻辑应该在命令处理程序中,您可以这样做,并且确实应该在命令到达处理程序存根之前进行数据检查,但不要进行任何域逻辑验证。也就是说,除了命令处理程序之外,没有其他地方可以针对域逻辑验证命令,因为这是加载聚合的地方。
您展示的验证是域验证,因此它们应该由您的聚合实际执行,所以是的,我认为您应该稍微分解这一责任,并拆分不同类型的验证:数据和域。