CQRS / DDD:检查参照完整性

时间:2017-08-09 07:51:32

标签: domain-driven-design cqrs referential-integrity

命令处理程序是否还应检查参照完整性?此常见问题解答建议您不应在汇总(http://cqrs.nu/Faq)中对此进行检查。是不是要检查某些内容是验证的一部分?

例如,您可以拥有一个应用程序,您可以在其中为文章添加注释。

该命令将包含以下字段:

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

对于此示例,评论和文章是不同的聚合器。

如果文章已经存在且用户存在,您应该检查此示例吗?您可以在不存在的文章中添加评论,这有点奇怪。

2 个答案:

答案 0 :(得分:4)

  

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

通常不,不。

  

您可以在不存在的文章中添加评论,这有点奇怪。

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

答案 1 :(得分:3)

我认为你有理由将Article和Comment分成不同的聚合根。当我面对像你这样的问题时,通常表明有机会重新思考域模型。

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

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

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

请记住,只有当事件发生在同一聚合根目录下时,才能依赖事件的顺序。

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