CQRS和电子邮件通知

t0P*_*PPy 6 email notifications domain-driven-design cqrs

阅读CQRS有很多关于电子邮件通知的讨论 - 我想知道从哪里获取数据.想象一下,一个用户邀请其他用户参加活动.为了通知用户他已被邀请参加活动,他将收到一封电子邮件.

具体步骤可能如下:

  1. CreateEvent与用户邀请的相关联的收集命令,是由服务器接收.
  2. Meeting创建新聚合并InviteUser为要被邀请的每个用户调用方法.
  3. 每次邀请用户参加活动时,UserWasInvitedToEvent都会引发域事件.
  4. 电子邮件通知发件人选择域事件并发送通知电子邮件.

现在我的问题是:我在哪里可以获取包含在电子邮件中的信息?

假设我想要包含事件的描述以及用户的名字.由于这是CQRS,我不能通过我的域模型得到它; 域对象的所有属性都是私有的!我应该查询读取方吗?或者可能完全将电子邮件通知移动到其他服务?

JD *_*toy 6

在CQRS中,您将命令与查询端分开.您总是希望转到查询端以获取给定事件处理程序的数据.写入数据库将是一个单独的数据库,其中包含构建域对象所需的数据,并且不会针对读取进行优化,而是针对写入进行优化.

  1. 域应该注册并向EventCreated事件处理程序/处理器发送事件.这可以从Meeting聚合的构造函数中引发.
  2. 事件处理组件将获取EventCreated事件,并使用事件中包含的数据(即事件的Id及其名称)更新查询数据库.
  3. 域可以注册并向UserWasInvitedToEvent事件处理器发送事件.
  4. 事件处理器将获取UserWasInvitedToEvent并使用所需的任何报告数据更新查询存储.
  5. 另一个事件处理组件也会接收UserWasInvitedToEvent事件.此过程可以访问查询数据库并撤回发送电子邮件所需的所有数据.

查询数据库只不过是一个报告数据库,因此您甚至可以在一个地方存储一个特定的表来存储电子邮件所需的所有数据.

为了将几个不同的事件编排到一个处理程序中(假设事件可能在不同的时间以不同的顺序处理),您可以在消息传递总线中使用Saga的概念.NServiceBus是支持Saga的消息传递总线的一个例子.请参阅此StackOverflow问题:NServiceBus延迟消息处理.

  • @ t0PPy请在此处发布一个新答案,详细说明您的首选解决方案,并将其标记为您的批准答案.所以关于能够在以后找到问题的答案也是如此.后来发现这个问题的人可能会错过有关丰富事件的信息,恕我直言是CQRS中非常重要的概念.更多信息给大众! (3认同)