JOliver の Event Storeを使用して、単一のトランザクションで複数の集計を更新することについて質問があります。私が理解しているように、すべての集計には独自のイベント ストリームが必要です。現在、多くのコマンド ハンドラーは 1 つの集計のみをロードし、その集計のみを更新します (つまり、それらの集計のイベントを保存します) が、複数の集計を更新する必要があるコマンド ハンドラーが存在することが想像できます。そしてもちろん、私はそれをトランザクションの方法で行いたいと思っています。
ただし、イベント ストアでそれを行う方法がわかりません。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);
これは、イベント ストアの使用方法について何かが完全に欠けているように感じさせます。誰か助けてくれませんか?どうもありがとう!