c# - 通过 Saga ID 而不是额外的聚合根来关联聚合

标签 c# mysql cqrs event-sourcing saga

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

我正在尝试使用 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/

相关文章:

c# - sqlite, mono, C# 跨平台

c# - 如何以不同的格式格式化 DateTime?

php - 意外的 T_STRING,期待 T_FUNCTION

cqrs - 是否可以在没有 Axon Server Enterprise 的情况下扩展 Axon Framework

domain-driven-design - CQRS 模式问题

c# - 在 C# 中,如何获取输出文件中每个文本行的文件位置(在写入时)?

c# - 正则表达式 - 文件名中的版本

php - 无法在php中使用mysql查询插入数据

mysql - 在表中添加一个字段并检查另一列的条件

c# - 作为单个 HTTP 请求的一部分执行顺序 MediatR 命令/查询的最佳实践?