使用其他型号进行验证
答
您通常会验证一个命令,而不是一个事件作为一个事件应是一种无法改变
在回答问题时,通常要看是什么过程的业务成本。例如,在你的例子中,订购已售罄物品的业务的成本是多少?可能很少 - 一封电子邮件称该商品缺货,估计需要多长时间。
在这种情况下,您可以对数据使用最终一致的读取模型,您可以在此处查询读取模型/缓存的库存水平,但接受某些订单可能会处理缺货的情况。
如果你有更严格的限制,那么你就必须执行它们,最好通过重塑你的集合体,或有交易和/或阻塞订购过程。
答
什么是验证它使用另一种模式的事件的选项?
A domain event
从业务的角度来看是一个重要的事情。这是过去发生的事情,所以不能改变。 在OO中,它通常表示为Value Object
,也就是说,一个不可变的对象,其中有趣的部分是它们的属性。
通常,这些Domain Events
是从Aggregate Root
(DDD专业术语)的操作中产生的。 Aggregate Root
的客户端是Application Service
(aka用例)。 Application Service
收到一个Command
对象并基于此,执行Aggregate Root
中的操作。
的验证可能在于原始验证,对象的验证和/或组成的对象的验证。然后负责执行此验证的对象应该是本身和/或具有验证中的特定目标的一些对象。
当增加一个购物车项目到购物车,应该有一个检查 如果该项目是不卖了没有
按照您的示例对象woulb是:
- 命令:
AddItemToShoppingCartCommand
。保存关于要添加的项目的信息,以及例如购物车标识符。 - 应用服务:
AddItemToShoppingCartService
。 - 总根:
ShoppingCartInventory
。我故意在名称中使用Inventory
以明确表示此Aggregate Root
满足不变量“...如果该项目尚未售罄。“
注:在我看来,它检查在Aggregate Root
库存不变,使得总太大我的建议是放宽这个不变的拥抱最终一致性,如果这一点。‘售罄’这是没有正常发生
事件采购意义上的事件无法验证,它们已经发生。 – guillaume31