需要DB调用的CQRS命令验证

Mut*_*taz 3 domain-driven-design cqrs akka akka-persistence

在CQRS中,验证需要数据库调用的命令的最佳方法是什么?例如,我有一个Order聚合验证命令说CommitOrder,除非有足够的库存,否则我不想接受此命令.在这种情况下,命令处理程序如何检查我是否有订单商品的库存或没有?我可以从写入端查询读取端吗?

注意:我正在使用akka来实现

Voi*_*son 7

如果聚合需要查询读取模型以执行规则验证,那么通常的方法是通过域服务 - 您将一个指定查询合同的接口传递给服务,该合同的实现运行查询.

但是你需要意识到运行查询得到的答案是老的; 存储在另一个聚合中的数据不能被认为是"最新的".

你还应该仔细检查你的要求; 在许多领域,即使库存目前不可用,也希望接受订单.毕竟,订单是增加商业价值的机会; 你不想否决那些不相关的问题.当企业已经了解如何减轻"缺货"异常时,尤其如此.

请记住,来自其他聚合的数据是陈旧的 - 完全有可能系统的另一部分当前正在更新库存水平,以便您可以接受订单.

如果在库存不可用时无法放松提交订单的要求,并且如果使用陈旧查询数据的错误率高得令人无法接受,那么您需要重新设计聚合,以便当前库存水平具有相同的一致性边界作为订单提交.