根据聚合的

时间:2018-06-06 15:42:15

标签: domain-driven-design cqrs

我按照DDD和CQRS原则开发了一个事件源应用程序,允许发布广告来销售商品。

我试图建模的一个特定的不变量似乎涉及AR的批量更新,而我真的不知道如何去做。

不变量就是这样:

  • 会员可以发布广告
  • 会员可能被管理员
  • 禁止
  • 如果会员被禁止,则必须暂停其广告

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

我设计了我的聚合根源:

  • 会员
  • 广告
  • 顺序

会员可以是买家或卖家,具体取决于具体情况,因此我会根据需要装饰会员对象。

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

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

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

虽然我可以依赖买家交易的会员身份,但广告跟踪其状态非常重要,因为还有其他类似的操作可能触发向该会员发送电子邮件,表明他的广告因此原因被暂停。

所以经过深思熟虑后我的最佳方法是创建一个长时间运行的进程,在其中我为MemberWasBanned创建一个处理程序,然后在读取模型中查找他的活动广告,并发出命令将它们逐个挂起

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

如果您有消息传递机制,也许您可​​以“爆炸” MemberWasBanned 事件。

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

然后,当消息传递机制处理这些事件时,每个事件都只会在单个聚合(每个广告,禁用它)上写入。

同时,被禁用户将阻止插入更多广告,因此您也可以安全地使用。