CQRS/DDD: 检查参照完整性

CQRS/DDD: Checking referential integrity

命令处理程序还应该检查参照完整性吗?此常见问题解答建议您不要在聚合 (http://cqrs.nu/Faq) 中检查此项。检查某些东西是否存在是验证的一部分吗?

例如,您可以拥有一个可以向文章添加评论的应用程序。

该命令将包含以下字段:

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

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

Should you check for this example if the article already exists and the user exists?

通常不会,不会。

It feels a bit strange that you can add a comment to an article that doesn't exists.

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

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

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

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

如果验证确认文章存在怎么办?也许版主已经删除了它,但结果还没有传播?

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

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