在CQRS中,验证需要数据库调用的命令的最佳方法是什么? 例如,我有Order
聚合,验证命令说CommitOrder
,我不想接受这个命令,除非有足够的股票。 在这种情况下,命令处理程序如何检查是否有订单项的库存或不存在?我可以从写入端查询读取端吗?需要DB调用的CQRS命令验证
注:我使用的是阿卡实施
在CQRS中,验证需要数据库调用的命令的最佳方法是什么? 例如,我有Order
聚合,验证命令说CommitOrder
,我不想接受这个命令,除非有足够的股票。 在这种情况下,命令处理程序如何检查是否有订单项的库存或不存在?我可以从写入端查询读取端吗?需要DB调用的CQRS命令验证
注:我使用的是阿卡实施
如果总需要查询读取模型来执行规则验证,那么通常的方式做到这一点是通过域名服务 - 你传递给服务一个指定查询合同的接口,该合同的实现运行查询。
但是,您需要留意事实,即您从运行查询得到的答案是旧的;存储在另一个聚合中的数据不能被认为是“最新的”。
您还应仔细检查您的要求;在许多领域,即使库存目前不可用,也希望接受订单。毕竟,订单是增加商业价值的机会;你不想在一个不相关的问题上否决这个问题。当企业已经了解如何减轻“缺货”例外情况时尤其如此。
请记住,来自其他集合的数据过时 - 系统的另一部分当前正在更新库存水平以便您可以接受订单是完全可能的。
如果在库存不可用时无法放松提交订单的要求,并且如果使用陈旧查询数据的错误率高得令人无法接受,那么您需要重新设计合计,以便当前库存水平为在与订单提交相同的一致性边界内。
感谢您的回答。是的,我同意你关于实际的商业需求和陈旧的数据。我的问题是设计问题,最终你会遇到这个查询读写问题。所以我害怕摆脱依赖缠绕的方向。把命令验证推送到一个独立的服务,在写入和读取之间进行协调?如果是这样,可以使用佐贺或我需要创建另一项服务,并保持传奇工作流只? – Mutaz
命令可以执行查询,但查询无法执行命令 – CSharper