t0P*_*PPy 6 email notifications domain-driven-design cqrs
阅读CQRS有很多关于电子邮件通知的讨论 - 我想知道从哪里获取数据.想象一下,一个用户邀请其他用户参加活动.为了通知用户他已被邀请参加活动,他将收到一封电子邮件.
具体步骤可能如下:
CreateEvent与用户邀请的相关联的收集命令,是由服务器接收.Meeting创建新聚合并InviteUser为要被邀请的每个用户调用方法.UserWasInvitedToEvent都会引发域事件.现在我的问题是:我在哪里可以获取包含在电子邮件中的信息?
假设我想要包含事件的描述以及用户的名字.由于这是CQRS,我不能通过我的域模型得到它; 域对象的所有属性都是私有的!我应该查询读取方吗?或者可能完全将电子邮件通知移动到其他服务?
在CQRS中,您将命令与查询端分开.您总是希望转到查询端以获取给定事件处理程序的数据.写入数据库将是一个单独的数据库,其中包含构建域对象所需的数据,并且不会针对读取进行优化,而是针对写入进行优化.
EventCreated事件处理程序/处理器发送事件.这可以从Meeting聚合的构造函数中引发.EventCreated事件,并使用事件中包含的数据(即事件的Id及其名称)更新查询数据库.UserWasInvitedToEvent事件处理器发送事件.UserWasInvitedToEvent并使用所需的任何报告数据更新查询存储.UserWasInvitedToEvent事件.此过程可以访问查询数据库并撤回发送电子邮件所需的所有数据.查询数据库只不过是一个报告数据库,因此您甚至可以在一个地方存储一个特定的表来存储电子邮件所需的所有数据.
为了将几个不同的事件编排到一个处理程序中(假设事件可能在不同的时间以不同的顺序处理),您可以在消息传递总线中使用Saga的概念.NServiceBus是支持Saga的消息传递总线的一个例子.请参阅此StackOverflow问题:NServiceBus延迟消息处理.