使用其他模型进行验证

Validation using other models

验证使用其他模型的事件有哪些选项?

购物车示例:

将购物车商品添加到购物车时,应检查该商品是否尚未售罄。

您通常会验证命令而不是事件,因为事件应该是无法更改的东西

在回答问题时,通常取决于流程的业务成本是多少。例如,在您的示例中,订购售罄商品的业务成本是多少?可能很少 - 一封电子邮件说该商品缺货,并估计需要多长时间。

在这种情况下,您可以对数据使用最终一致的读取模型,您可以在其中查询读取模型/缓存以了解库存水平,但接受一些订单可能会处理超出的情况现货。

如果您有更严格的约束,那么您将不得不强制执行它们,最好是通过重构您的聚合,或者在订购过程中进行交易 and/or 阻塞。

What are the options to validate an event which uses another model?

A domain event 从业务的角度来看是一个重要的事件。这是过去发生的事情,所以无法改变。 在 OO 中,它通常表示为 Value Object,也就是说,一个不可变的对象,其中有趣的部分是它们的属性。

通常,那些 Domain EventsAggregate Root(DDD 术语)中的操作的收益。 Aggregate Root 的客户端是 Application Service(又名用例)。 Application Service 收到一个 Command 对象并基于该对象在 Aggregate Root.

中执行操作

验证可以包括原始验证、对象验证and/or 组合对象验证。那么负责执行此验证的对象应该是 Aggregate Root 本身 and/or 一些具有特定目标的对象。

When adding a cart item to the shopping cart, there should be a check if the item isn't sold out yet

按照您的示例,对象将是:

  • 命令:AddItemToShoppingCartCommand。保存有关要添加的项目的信息,例如购物车标识符。
  • 应用服务:AddItemToShoppingCartService.
  • 聚合根:ShoppingCartInventory。我在名称中故意使用 Inventory 来明确表示此 Aggregate Root 满足不变量“...如果商品尚未售罄。”

注意:在我看来,Aggregate Root中检查库存的不变量使得聚合太大.我的建议是放宽此不变性,如果 "sold out" 它不是正常发生的,则采用最终一致性。