J Olivers事件商店 - Saga帮助

时间:2011-07-31 20:07:48

标签: cqrs

我正试图用Jonathan Olivers EventStore和CommonDomain把我的头围绕着Saga。我理解Aggregates如何使用CommonDomain / EventStore但我仍然坚持抓住Saga的用法。我已经阅读了Jonathan的Saga's和Event Sourcing Part I& II但在实际实施中失去了基础

1)更多的观察,当持久的传奇时,EventStore正在利用Headers来保存需要发送的Saga和Commands,看起来Payload正在存储触发Saga“唤醒”的事件。想知道这个原因。我们是否永远不想存储单个命令而不是将它们全部放在标题中?

1)由于SagaBase中的“Transition”方法总是将事件重新添加到未提交的集合中,因此触发Saga的事件似乎会被多次重播。 (与具有内部Apply方法vs公共Domain方法的AR不同)。也许我没有正确使用Transition方法

2)通常,与EventStore一起使用的总线将发布事件(我实现了IPublishMessages)。如果我需要我的Saga发布命令,似乎没有发送选项。我是否需要解析Headers以获取命令?

我在想我正在使用CommonDomain / EventStore,因为使用Aggregates很容易,但Saga对我来说似乎“不完整”。我假设它,因为我没有正确地做到这一点。对CQRS来说还是一个新手。有没有人有使用J Olivers Common Domain / Event Store的Saga的工作示例?我认为这样可以大大改善。

[编辑] 我想我想出来但想要一些意见。佐贺真的不应该发布活动。他们发出命令。因此,在EventStore(IPublishMessages)的事物的发布方面,我应该首先检查消息的类型(AggregateType vs SagaType)。对于AggregateTypes,我可以发布事件,但是SagaTypes只发布命令(在Header中找到)。这消除了相同的事件(比如说OrderSubmittedEvent),它会在持久化传奇时触发创建Saga而不再发布它。

1 个答案:

答案 0 :(得分:1)

  1. 这些命令放在要在总线上发送的标题中。 EventStore关注事件的存储,因此导致saga转换的事件会持久存在。之后,当从事件流加载saga时,事件将被传递给saga的转换方法,以使其进入当前状态。

  2. 转换方法在saga实现中具有双重用途。调用Transition来处理传入消息并从peristence中加载saga。在SagaEventStoreRepository.BuildSaga中,在构建当前状态后在传奇上调用ClearUncomittedEvents和ClearUndispatchedMessages,从而避免重复事件和命令处理。

  3. 我个人没有这样做,但我会为我的传奇使用一个单独的EventStore实例。这将允许使用单独的IPublishMessages实现从事件头中获取命令并发送它们。