我有一个关于使用JOliver 的 Event Store在单个事务中更新多个聚合的问题。据我了解,每个聚合都应该有自己的事件流。现在,虽然许多命令处理程序只会加载单个聚合并只更新该聚合(即为这些聚合保存事件),但我可以想象会有需要更新多个聚合的命令处理程序。当然,我想以交易的方式做到这一点。
但是,我不知道如何使用 Event Store 做到这一点。通过调用CommitChanges()
事件流来存储事件。如果我们有多个要更新的聚合,将有多个事件流,因此会多次调用CommitChanges()
. 使该事务具有事务性的唯一方法是将其包装在 中TransactionScope
,但这没有多大意义,因为底层存储技术可能不支持事务。所以我最终得到了这段代码,这绝对不是我想要的:
Guid aggregateGuid1 = Guid.NewGuid();
Guid aggregateGuid2 = Guid.NewGuid();
Guid commitGuid = Guid.NewGuid();
var stream = store.OpenStream(aggregateGuid1, 0, int.MaxValue);
stream.Add(new EventMessage() { Body = new MonitorDisabled { MonitorGuid = aggregateGuid1, User = "A" } });
stream.CommitChanges(commitGuid);
stream = store.OpenStream(aggregateGuid2, 0, int.MaxValue);
stream.Add(new EventMessage() { Body = new MonitorEnabled { MonitorGuid = aggregateGuid2, User = "B" } });
// Can't commit twice with the same commit id, what if fails after first one? No way for the store to know it had to write the second part of the commit.
stream.CommitChanges(commitGuid);
这让我觉得我完全错过了应该如何使用 Event Store 的一些东西。有人可以帮我吗?非常感谢!