【发布时间】:2023-03-20 02:40:02
【问题描述】:
我正在尝试使用 Jonathan Olivers EventStore 和 CommonDomain 来了解 Saga。我了解 Aggregates 如何与 CommonDomain/EventStore 一起工作,但我坚持掌握 Saga 的用法。我已经阅读了 Jonathan 的 Saga 和 Event Sourcing Part I 和 II 但在实际实施中迷失了
1) 更多观察,当持久化 saga 时,EventStore 正在利用 Headers 来持久化 Saga 和需要发送的命令,看起来 Payload 正在存储触发 Saga “唤醒”的事件.想知道这其中的原因。我们永远不想存储单个命令而不是将它们全部放在标题中吗?
1) 似乎触发 Saga 的事件被重播了多次,因为 SagaBase 中的“Transition”方法总是将事件重新添加到未提交的集合中。 (与具有内部 Apply 方法和公共域方法的 AR 不同)。也许我没有正确使用 Transition 方法
2) 通常,您与 EventStore 一起使用的总线将发布事件(我实现了 IPublishMessages)。如果我需要我的 Saga 发布命令,似乎没有发送选项。我需要自己解析标题来获取命令吗?
我认为我错误地使用了 CommonDomain / EventStore,因为使用 Aggregates 很容易,但 Saga 对我来说似乎“不完整”。我假设它是因为我没有正确地做到这一点。 CQRS 还是很新的。有没有人有 Saga 使用 J Olivers Common Domain / Event Store 的工作示例?我认为这会大大澄清事情。
[编辑] 我想我想通了,但想要一些输入。 Saga 真的不应该发布事件。他们发出命令。因此,在 EventStore (IPublishMessages) 的发布方面,我应该首先检查消息的类型(AggregateType 与 SagaType) 对于 AggregateTypes 我可以发布事件,但对于 SagaTypes 仅发布命令(在 Header 中找到)。这消除了触发创建 Saga 的相同事件(例如 OrderSubmittedEvent),以便在持久化 saga 时不再发布它。
【问题讨论】:
标签: cqrs