CQRS和电子邮件通知

时间:2010-05-26 13:43:17

标签: email domain-driven-design notifications cqrs

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

具体步骤可能如下:

  1. 服务器收到一个CreateEvent命令,其中包含要邀请的相关用户集合。
  2. 创建新的Meeting聚合,并为每个要邀请的用户调用方法InviteUser
  3. 每次邀请用户参加活动时,都会引发域事件UserWasInvitedToEvent
  4. 电子邮件通知发件人选择域事件并发送通知电子邮件。
  5. 现在我的问题是:我在哪里可以获取信息以包含在电子邮件中?

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

1 个答案:

答案 0 :(得分:6)

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

  1. 域应注册并向事件处理程序/处理器发送EventCreated事件。这可以从Meeting聚合的构造函数中提出。
  2. 事件处理组件将获取EventCreated事件,并使用事件中包含的数据(即事件的Id及其名称)更新查询数据库。
  3. 域可以注册并向事件处理器发送UserWasInvitedToEvent事件。
  4. 事件处理者会选择UserWasInvitedToEvent并使用所需的任何报告数据更新查询存储。
  5. 另一个事件处理组件也会选择UserWasInvitedToEvent事件。此过程可以访问查询数据库并撤回发送电子邮件所需的所有数据。
  6. 查询数据库只不过是一个报告数据库,因此您甚至可以在一个地方存储一个特定的表来存储电子邮件所需的所有数据。

    为了将多个不同的事件编排到一个处理程序中(假设事件可能在不同的时间以不同的顺序处理),您可以在消息传递总线中使用Saga的概念。 NServiceBus是supports Saga's的消息传递总线的示例。请参阅此StackOverflow问题:NServiceBus Delayed Message Processing