2011-09-08 65 views
3

我有一个问题如何处理一个传奇,其中使 的决定取决于创建传奇之前所公布的一个事件。佐贺依赖于事件从过去

这是说明我的问题的示例:

想象我有一个CustomerAR和OrderAR。当customerAR是 创建了一个验证过程开始,这个过程的结果是 量的订单,客户是免费无特殊 授权的花费。我不会详细讨论这个过程,因为 它与上下文无关。在计算金额时,命令将以计算的金额 发送到CustomerAR,并且客户AR 发布具有该值的事件(CustomerMaxOrderAmountEvent)。所以 非常好。

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

我应该如何处理这个问题。我应该查询读取模型知道 价值,我应该发送一个命令来获取值,我应该做一个 参考CustomerAR,我要重播所有的历史事件 传奇,所以他知道历史了。

UPDATE

请注意,这是关于这个概念不是这个具体的例子。这个例子纯粹是为了澄清问题:“两个不相关的聚合根不属于同一个有界的上下文。”

感谢您的帮助。

梅尔文

回答

1

我会去简单的解决方案 - 只是(在HasCustomerReachedMaxOrderAmount形式为例)将此信息添加到启动佐贺事件。

我会选择第二个选项是准备读模型设计与传奇故事,并从那里查询数据可以使用,但我会收集所有的传奇故事开始之前就所需的信息。这种充实可以由AR引发的原始事件的处理程序来执行,因为这不是Aggregate/Bounded Context的一部分。

不过在大多数情况基础上的事件传递的数据是足够的,由于这样的事实,传奇故事应该只包含过程的形式业务逻辑。这通常意味着你可能会得到一个以上的佐贺(按照你的例子OrderSagaOrderWithMaxAmountSaga)。

所有这一切说,考虑到你所提供的示例场景,我认为,为了决定是否需要授权或不应该,而成为你的域名本身并同时开始传递传奇的一部分。

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

+0

谢谢你的回答。我同意这是针对这种特定情况的可能解决方案。但是,当两个聚合根不属于相同的有界环境或不具有直接关系时,情况如何呢?首先这是不可能的,但我们也希望在事件中放入不相关的数据,因为一些传奇需要这些数据。根据DDD,我不应该由谁来监听或处理事件来考虑我的AR。它应该提供与事件相关的数据而不是事件的处理者。 – llMll

+0

我已更新我的回答以反映您的评论。 – kstaruch

+0

我同意你的第二个选择。这实际上是我现在正在做的事情,但不知何故是不正确的,但我可能是错的。我也同意这样的事实,即我必须根据事件中的数据做出决定,但这是我想要的。只有这个活动在过去发表过。我不能完全遵循你关于多重传奇的观点,以及这将如何在这种情况下有所帮助。我仍然必须根据不包含我需要做出该决定的数据的事件做出决定。我希望你能为我清除最后一点。 – llMll

0

我刚开始与DDD玩水,我不打算重复任何kstaurch说,但这里有一些想法我已经在看你的场景:

  1. 关于做什么最大订单金额部分的账单信息?这必须在某个地方得到,我相信你会照顾付款处理被拒绝的情况。

  2. 如果传奇总是发送授权命令,但它是处理最大订单屏幕的授权部分?如果你在说“如果金额超过$ X,那么获得授权”,也许你的商业模式也认为它是“如果它在$ X以下,自动批准”。其好处是可以将全部批准考虑事项(包括是否获得批准)转移到批准实体或传奇。