CQRS + イベント ソーシングを積極的に使用しているプロジェクトに移動しました。一見すると、それらすべての本やブログに従って実装されていますが、最終的に実装の何が悪いのかを理解しました。
CQRS アーキテクチャは次のとおりです。
もともとここからこの写真を撮りました。
図でわかるように、読み取り側はキューからイベントを受け取り、それを 1 つずつさまざまなプロジェクション (デノーマライザー) のセットに渡します。その後、結果の ViewModel は AddOrUpdate メソッドを介して DB などに保存されます。写真からわかるように、デノーマライザーはイベント自体と読み取り側のデータベースからのデータのみに依存できます。例えば:
- アカウント ビューは既にデータベースに保存されています。
- EmailChanged イベントが到着
- DB から Account ビューを読み込みます
- 電子メールの変更を適用する
- Account を DB に保存します。
別のケース(いくつかのアイテムの数を数える、注文など):
- OrderCreated イベントが到着
- NumberOf 以前に到着した注文を表す ViewModel を読み取ります
- これをインクリメントして保存します。
プロジェクトの内容: これらのイベントはすべて、ドメイン モデルで何かが変更されたことを通知する手段としてのみ使用します。したがって、私たちが行うこと:
- ドメイン リポジトリを取得し、必要なすべての集計を読み取ります。そうすることで、それらの最新の状態を取得します。
- ViewModel オブジェクトをゼロから構築するだけです
- 新しく作成したオブジェクトを Db に保存する
私たちのプロジェクトで使用するアプローチは、私には少し奇妙に見えますが、そのすべての欠点はわかりません。読み取り側を再構築する必要がある場合は、「アクティブな」デノーマライザーを追加し、次に特定のイベントを受け取ったときに、新しいビューモデルを再作成します。
本のアプローチを使用する場合、再構築のためにシステムのどこかに別のユーティリティロジックを用意する必要があります。これに必要なもの:
- 読み取り側をドロップ
- イベント ストアからすべてのイベントを最初から読み取る
- それらを投影に通す
私の質問は次
のとおり
です。ここでの正しいアプローチは何ですか?