背景 :
解释 CQRS 的图表通常会清楚地分离读写路径和单向数据流,就像在这个例子中一样(来源:Demystified CQRS):
题 :
我想澄清一下,
如果后端的命令执行需要从数据库中获取一些数据,
“写入端”是否应该从写入数据库中获得一些读取功能?
可能 - 加载将要运行命令的实体的最直接方法是从“写入数据库”读取其状态。例如,在事件源架构中,更新事件源实体的命令通常通过从写入模型加载该实体的历史记录、从该历史记录中重新组合实体、评估该命令并将新更改附加到历史记录来处理。
读取不处理命令的实体的状态是另一回事——ddd词汇在这里有帮助;您正在修改的状态恰好属于一个聚合,只要有可能,就应该将聚合之外的状态传递给模型,而不是获取。
这可能意味着远程客户端需要提供数据,或者可能意味着处理命令的应用程序获取所需的读取模型并提供答案。有许多不同的问题会影响您在此处做出的选择
所以没有一个最佳答案,只是在不同的关注点之间进行权衡。
最近出现了后者的一个例子——如果您的业务模型要求某些命令需要特定用户的权限,那么我们不应该从表面上获取客户的命令;我们需要应用程序验证命令发布者的身份,然后将该身份的表示传递给模型,以便它可以确定要采取的操作。