命令处理程序是否还应检查参照完整性?此常见问题解答建议您不应在汇总(http://cqrs.nu/Faq)中对此进行检查。是不是要检查某些内容是验证的一部分?
例如,您可以拥有一个应用程序,您可以在其中为文章添加注释。
该命令将包含以下字段:
对于此示例,评论和文章是不同的聚合器。
如果文章已经存在且用户存在,您应该检查此示例吗?您可以在不存在的文章中添加评论,这有点奇怪。
答案 0 :(得分:4)
如果文章已经存在且用户存在,您应该检查此示例吗?
通常不,不。
您可以在不存在的文章中添加评论,这有点奇怪。
责任分离:域模型负责了解命令如何应用于模型的当前状态。命令处理程序只检查命令的完整性。
答案 1 :(得分:3)
我认为你有理由将Article和Comment分成不同的聚合根。当我面对像你这样的问题时,通常表明有机会重新思考域模型。
参照完整性检查没有任何问题,但请考虑不属于同一根的聚合更改的最终性质。验证结果表明了什么?
如果文章不存在,是不是因为没有添加,而且命令中存在完整性问题?或者它可能已添加但尚未传播到应用程序的查询端?或者可能在用户发布评论之前已经删除了它?
如果验证确认文章存在,该怎么办?也许主持人已将其删除,但结果尚未传播?
请记住,只有当事件发生在同一聚合根目录下时,才能依赖事件的顺序。
总结一下:只要您意识到可能存在误报和漏报,您就可以在命令处理程序中验证参照完整性。如果您希望传入的命令经常具有不可靠的数据,则此验证可能会限制错误率。但是,如果一致性很重要,请尝试重新考虑聚合的结构。