Joc*_*hen 5 transactions aggregate cqrs event-store
我在使用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);
Run Code Online (Sandbox Code Playgroud)
这让我觉得我完全错过了应该如何使用Event Store的东西.有人可以帮帮我吗?非常感谢!
我不能代表约翰·奥利弗,但我认为答案是“不要”。聚合是事务边界。如果您需要协调多个聚合的提交,则需要一个显式的协调过程(例如传奇),它将执行并在必要时撤消相关事件。
| 归档时间: |
|
| 查看次数: |
1305 次 |
| 最近记录: |