按Saga ID而不是其他聚合根关联聚合

时间:2015-06-08 08:55:59

标签: c# mysql cqrs event-sourcing saga

这是我的第一个问题,如果不清楚或不完整,请原谅我,让我知道如何提供更多信息。

我正在尝试使用CQRS + ES构建电子邮件票务系统。因此,电子邮件会加入到对话中(类似于前景对话,但具有不同的加入条件),然后会为这些对话分配一个人们可以与之交互的标记(标记,更新其状态,添加注释......)。 BR />

目前,收到邮件后,会创建一个新的邮件聚合,从而引发MailReceived事件 ProcessManager路由器(或saga路由器)试图找到一个匹配的" ConversationSaga"根据标准或创建新标准。传奇发送命令以将会话ID分配给邮件聚合 - >这会引发ConversationAssigned邮件。

最后一个事件ConversationAssigned被Ticketing有界上下文拦截,该上下文根据对话ID生成故障单或更新现有故障单。创建/更新故障单后,事件将路由到ConversationSaga以发送所需命令(ApplyTicketToMail - > MoveMailToFolder - > ...)

我的问题是:
1-使用Saga Id作为会话ID将多个邮件链接在一起是不正常的? 2-我正在检查创建Conversation Aggregate root的可能性,但我仍然对事件采购不熟悉,并且不知道如何在AggregateRoots中处理事件源实体(我需要Mail为事件来源聚合)。

PS: 我正在使用C#,使用MsSql DB和nhibernate,并且发送消息已经过了RabbitMq。

1 个答案:

答案 0 :(得分:0)

我有一些问题需要阅读/理解您的描述,但整体设计对我来说似乎很好。特别是,通常的做法是从单个传奇中编排多个AR。

根据您所写的内容,我确实建议创建一个与Conversation AR分离的新Mail聚合,特别是因为您已将其命名为({conversation}),并且因此它似乎是无处不在的语言中的一个术语。