7

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

具体步骤可能是这样的:

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

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

假设我想包含事件描述以及用户名。由于这是 CQRS,我无法通过我的域模型得到它;域对象的所有属性都是私有的!然后我应该查询读取端吗?或者也许将电子邮件通知完全移动到不同的服务?

4

1 回答 1

6

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

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

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

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

于 2010-05-26T21:09:55.000 回答