首页 文章

需要DB调用的CQRS命令验证

提问于
浏览
3

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

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

1 回答

  • 7

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

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

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

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

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

相关问题