这是我的第一个问题,所以如果不清楚或不完整,请原谅我,并让我知道如何提供更多信息。
我正在尝试使用 CQRS + ES 构建一个电子邮件票务系统。因此,电子邮件被加入到对话中(有点像 Outlook 对话,但加入标准不同),然后为这些对话分配一个票证,人们可以在其中进行交互(标记它、更新其状态、添加注释...)。< br/>
目前,一旦收到邮件,就会创建一个新的邮件聚合,该聚合会引发 MailReceived
事件。
ProcessManager 路由器(或 saga 路由器)尝试根据条件查找匹配的“ConversationSaga”或创建一个新的。 saga 发送一条命令,将对话 ID 分配给邮件聚合 -->,这会引发 ConversationAssigned
邮件。
最后一个事件 ConversationAssigned
被票务限界上下文拦截,该上下文生成票证或根据对话 ID 更新现有票证。创建/更新票证后,事件将路由到 ConversationSaga 以发送所需的命令(ApplyTicketToMail --> MoveMailToFolder --> ...)
我的问题是:
1-使用Saga Id作为 session Id将多封邮件链接在一起是否不正常?
2-我正在检查创建 Conversation Aggregate
根的可能性,但我对事件源仍然很陌生,并且不知道如何处理 AggregateRoots 中的事件源实体(我需要 Mail 成为事件源聚合)。
PS:我正在使用 C#、MsSql DB 和 nhibernate,并且消息传递通过 RabbitMq 进行。
最佳答案
我在阅读/理解你的描述时遇到一些问题,但整体设计对我来说似乎很好。特别是,从单个传奇中编排多个 AR 是一种常见的做法。
根据您所写的内容,我确实建议创建一个与 Mail
AR 分离的新 Conversation
聚合,特别是因为您已经这样命名了它( “对话”),因此它似乎是来自普遍语言的术语。
关于c# - 通过 Saga ID 而不是额外的聚合根来关联聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30704898/