在CQRS中,验证需要调用DB的命令的最佳方法是什么?
例如,我有Order
聚合验证命令CommitOrder
,除非有足够的库存,否则我不想接受此命令。
在这种情况下,命令处理程序如何检查我是否有订单商品的库存或没有?我可以从写入端查询读取端吗?
注意:我正在使用akka实现
答案 0 :(得分:7)
如果聚合需要查询读取的模型以执行规则验证,那么通常的方法是通过域服务 - 将服务传递给指定查询合同的接口,实现合同运行查询。
但是你需要留意这样一个事实:你从运行查询得到的答案是老的;存储在另一个聚合中的数据不能被假定为最新的"。
您还应该仔细检查您的要求;在许多领域,即使库存目前不可用,也希望接受订单。毕竟,订单是增加商业价值的机会;你不想否决那些不相关的问题。当企业已经了解如何减轻缺货时,尤其如此。异常。
请记住,来自其他聚合的数据是陈旧的 - 系统的另一部分当前正在更新库存水平,以便您可以接受订单,这完全有可能。
如果在库存不可用时无法放松提交订单的要求,并且如果使用陈旧查询数据的错误率高得令人无法接受,那么您需要重新设计聚合以使当前库存水平与订单提交处于相同的一致性边界。