3

我有一个问题如何处理一个传奇,其中决策取决于在传奇创建之前发布的事件。

这是一个例子来说明我的问题:

想象一下,我有一个 CustomerAR 和一个 OrderAR。当创建 customerAR 时,验证过程开始,该过程的结果是客户无需特别授权即可自由消费的订单金额。我不会详细介绍这个过程,因为它脱离了上下文。计算金额时,将使用计算出的金额向 CustomerAR 发送命令,然后 CustomerAR 发布具有该值的事件 (CustomerMaxOrderAmountEvent)。到目前为止,一切都很好。

几周后,客户下了订单。OrderAR 已创建并启动我的 OrderSaga。saga 等待订单完全创建,然后必须做出决定是否需要为该订单发送 AutorizationCommand。要做出该决定,它必须知道 CustomerMaxOrderAmountEvent 是否已发布以及金额的值。通常 OrderSaga 也会订阅 CustomerMaxOrderAmountEvent,但问题是这个事件永远不会发生,因为它在过去已经发生过。

我该如何处理。我是否应该查询读取模型以了解该值,是否应该发送命令来获取该值,是否应该引用 CustomerAR,是否应该重播 saga 中的所有历史事件以便他已经知道历史。

更新

请注意,这是关于概念而不是关于这个具体示例。该示例纯粹是为了澄清问题:“2 个不相关的聚合根,它们不是同一有界上下文的一部分。”

感谢您的帮助。

梅尔文

4

2 回答 2

1

我会寻求更简单的解决方案 - 只需将此信息(例如以 的形式HasCustomerReachedMaxOrderAmount)添加到启动 Saga 的事件中。

我选择的第二个选项是准备一个用于 Sagas 的读取模型并从那里查询数据,但我什至会在 saga 开始之前收集所有必需的信息。这种丰富可以由处理程序对 AR 引发的原始事件执行,因为这不是聚合/有界上下文的一部分。

然而,在大多数情况下,基于事件传递的数据就足够了,因为 Sagas 应该仅以流程的形式包含业务逻辑。这通常意味着您最终可能会得到不止一个 Saga(以您的示例OrderSaga和为例OrderWithMaxAmountSaga)。

综上所述,考虑到您提供的示例场景,我认为订单是否需要授权的决定应该是您的域本身的一部分,并在启动 saga 时通过。

我会像这样模拟这种情况 -CustomerAR计算最大数量;客户下订单 ->使用该客户的最大金额信息OrderAR创建,验证是否需要额外授权 ->开始。关键是关于最大数量的信息对于(可以更改的地方)和(不可变的地方)都很重要。OrderSagaCustomerAROrderAR

于 2011-09-08T12:12:22.127 回答
0

我刚刚开始涉足 DDD,我不打算重复 kstaurch 所说的任何内容,但以下是我对您的场景的一些想法:

  1. 将最大订单金额作为计费信息的一部分怎么样?这必须在某个地方得到,我相信你会处理付款处理被拒绝的情况。

  2. 如果 saga总是发送授权命令,但处理最大订单屏幕的是授权部分怎么办?如果您说“如果金额超过 X 美元,则获得授权”,也许您的业务模型也将其视为“如果金额低于 X 美元,则自动批准”。好处是所有批准考虑(包括是否获得批准)都可以转移到批准实体或saga。

于 2011-09-19T14:06:17.690 回答