何时使用域名活动?

时间:2013-06-24 16:43:32

标签: concurrency domain-driven-design aggregate domain-events

在DDD中,我想知道何时应该使用域名事件?是否有适合使用域名事件的情况推荐?是否仅适用于最终一致可接受的情况?

假设在Product,Order,OrderLine的在线商店示例中,一个Order包含多个OrderLine。一个OrderLine与Product有一对一的关系,当我创建订单时,我需要扣除Product中可用的金额。我知道有两种方法:

  1. 在OrderService(应用程序服务)中:

    • 创建新订单,插入数据库
    • 对于订单中的每个订单行,获取与该OrderLine关联的产品,调用Product.UpdateQuantity()
    • 将所有产品保存到数据库
    • 注意:对我来说,似乎应用服务在这里完成大部分工作(创建订单,获取产品,更新产品),是否可以接受?
  2. 在OrderService中:

    • 创建新订单,插入数据库
    • 生成事件OrderCreated
    • 触发事件处理程序,调用Product.UpdateQuantity()
    • 注意:产品数量不保证立即更新
  3. 在现实生活中,哪种方式更受欢迎? 在这两种情况下,如何处理产品数量的并发更新?如果数量与用户看到结帐屏幕的时间不一致,请通知用户失败?

    非常感谢

1 个答案:

答案 0 :(得分:0)

我认为您的决定需要围绕工作单位和ACID。

如果此服务拥有数据库并且代表用户访问此信息的唯一界面,则该方法需要是由服务作为一个事务管理的单个工作单元。

我不明白您提供的两个示例之间的区别。

当我在亚马逊上订购商品时,我希望我的订单的产品数量能够立即更新并与我所说的一致。我不知道他们的库存系统是否“稍后赶上”或者它是否成为我交易的一部分。我不希望我的订单失败,因为他们的库存系统有问题。我可以看到他们可能有哪些机制使我的订单持久且持久,并让库存系统稍后赶上(可能是一个队列)。但这是服务可能不需要知道的细节。