基于聚合状态变化的聚合批量更新

Bulk update of aggregates based on state change of an aggregate

我正在开发一个遵循 DDD 和 CQRS 原则的事件源应用程序,它允许 post 投放广告来销售商品。

有一个我正在尝试建模的特定不变量似乎涉及 AR 的批量更新,但我真的不知道该怎么做。

不变量是这样的:

出于讨论的目的,广告需要具有状态,因为会员可以通过点击广告来购买商品,因此了解广告是否处于活动状态非常重要。

我这样设计聚合根:

Member可以是买家也可以是卖家,视上下文而定,所以我根据需要装饰了member对象。

发布广告时,当然会插入阅读模型。

现在,当会员被禁止时,会触发会员 AR 触发的关联事件。 MemberWasBanned (MemberId)

我的问题是如何找到会员拥有的每个广告并将其暂停?

虽然我可以依赖会员状态进行购买交易,但广告跟踪其状态很重要,因为还有其他类似的操作可能会触发向会员发送电子邮件,例如表明他的广告是由于这样或那样的原因暂停。

所以我经过深思熟虑后最好的方法是创建一个很长的 运行 过程,在这个过程中我为 MemberWasBanned 创建一个处理程序,然后在读取模型中寻找他的活动广告,并发出命令将它们一一暂停。

我错过了什么吗?我想过使用流程管理器,但读到你不应该从 PM 访问读取端。在任何情况下,在大多数情况下,PM 都会确定发送给 ONE AR 的命令。

我是不是漏掉了什么?

如果您有消息传递机制,也许您可​​以 "explode" MemberWasBanned 事件。

通过您的消息传递管道发布 MemberWasBanned(或等效)事件,并从处理广告的上下文中订阅它。当您的消息传递机制收到此事件时,您可以将其分解为多个 DisableAd 事件,这些事件也将通过您的消息传递系统发送,每个事件针对被禁成员的一个当前广告。

然后,当这些事件中的每一个被消息传递机制处理时,它们只会写入一个聚合(每个广告,禁用它)。

同时,被禁止的用户将阻止插入更多广告,因此您在这方面也是安全的。