У меня вопрос по поводу обновлений нескольких агрегатов в одной транзакции с использованием хранилища событий JOliver .Как я понимаю, каждый агрегат должен иметь свой собственный поток событий.Теперь, в то время как многие обработчики команд будут загружать только один агрегат и обновлять только этот агрегат (т.е. сохранять события для этих агрегатов), я могу представить, что будут обработчики команд, которым необходимо обновить несколько агрегатов.И, конечно, я хотел бы сделать это транзакционным способом.
Тем не менее, я не понимаю, как я мог бы сделать это с 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);
Это заставляет меня чувствовать, что я что-то упускаю из-за того, как следует использовать хранилище событий.Может ли кто-нибудь помочь мне здесь?Большое спасибо!