CQRS/DDD:检查参照完整性

问题描述:

命令处理程序是否也检查参照完整性?这个常见问题建议你不应该在总量中检查这个(http://cqrs.nu/Faq)。没有检查某些东西是否存在验证的一部分?CQRS/DDD:检查参照完整性

例如,您可以有一个应用程序,您可以在其中添加对文章的评论。

命令将有以下字段:

  • 编号
  • 条款ArticleID
  • 用户ID
  • 文本

在这个例子中的评论和文章都不同aggregateroot。

如果文章已经存在并且用户存在,你应该检查这个例子吗?感觉有点奇怪,你可以给不存在的文章添加评论。

我认为您有理由将文章和评论分为单独的聚合根源。当我面对像你这样的问题时,通常表明有机会重新考虑领域模型。

参照完整性检查没有任何问题,但考虑对不属于同一根的聚合的更改的最终性质。验证结果表明什么?

如果文章不存在,是否因为没有添加文章而导致命令中存在完整性问题?或者可能它已被添加,但尚未传播到应用程序的查询端?或者,也许它已经在用户发布评论之前被删除?

如果验证确认文章存在,该怎么办?也许主持人已经将其删除,但结果尚未传播?

请记住,当它们发生在同一个聚合根下时,您只能依赖事件的顺序。

总结:只要您意识到可能存在误报和误报,您就可以验证命令处理程序中的参照完整性。如果您希望传入的命令经常有不可靠的数据,那么这种验证可能会限制错误率。但是,如果一致性至关重要,请尝试重新考虑您的聚合结构。

您是否应该检查此示例,如果文章已经存在且用户存在?

没有通常,没有。

这感觉有点奇怪,你可以添加评论到一个不存在的文章。

职责的分离:在域模型负责了解如何命令适用于模型的当前状态。命令处理程序只是检查命令的完整性。

+3

同意。我只是补充说,即使域名不负责确定它是否可能会被调用,那么肯定应该有一些可能会导致域名的问题。例如,应该检查授权(应该允许该命令)。用同样的方法,应该检查执行命令是否确实可行,因为它对于为不存在的文章和不存在的用户添加评论显然是奇怪的。例如,这适用于为不存在的客户添加订单。 –