1

私は CQRS を初めて使用し、設計における次の状況についてアドバイスが必要です。コマンドは集合体 A の状態を更新します。その結果、クロス集計計算方法の結果で読み取りモデルを更新する必要があります。このメソッドは、集約 A への参照を保持する別の集約 B に属します。このメソッドは、集約 B と参照される集約 A の両方の状態の関数です。この関数を呼び出す正しい場所はどこですか?

私の考慮事項(スキップできます):

  • 集約 A の状態を更新するコマンド ハンドラーは、技術的にはリポジトリから集約 B をフェッチし、その上で計算を呼び出し、結果をドメイン イベントに入れることができます。ただし、読み取り目的であっても、変更されたもの以外の集計を取得するのはコマンド ハンドラーの仕事ではないと思います。また、ドメインの状態を変更するのではなく、イベントを送信するためだけに計算を実行するのは、コマンド ハンドラーの仕事ではありません。
  • 集約 A によって発生したドメイン イベント (' Aggregate A updated ') には、集約 A の更新された状態のみが含まれます。集約 B の状態に関する十分な情報がありません。読み取りモデルのイベント ハンドラーはドメイン モデルにアクセスできないため、集約をフェッチすることもできません。 B は、読み取りモデルを更新するために集計 B で目的の関数を呼び出すこともありません。
  • 変更される集約の外部にあるコマンドが必要とする状態は、コマンドとともに渡す必要があることを知っています。このようにして、アプリケーション サービスは、コマンドを送信する前に、集計 B の状態を (読み取りモデルから) フェッチし、それをコマンドに入れることができます。そのためには、関数を集計 B から何らかのサービスに移動し、そこに A と B の両方の状態を渡す必要があります。これにより、集計 B がより貧血になります。さらに、コマンドハンドラー内で計算を行う際の上記の問題。
  • 読み取りモデルのみが関心を持っている計算は、読み取りモデル自体に属していると示唆する人々を読みました。したがって、私のイベントの読み取りモデルのハンドラーは、計算を実行するために必要なすべての状態と動作を自由に使用できます。ただし、それはクエリ側でドメイン モデルの概念の多くを複製する必要があることを意味します。本格的な読み取りモデルを作成するには複雑すぎます。

次の解決策を考えました: ドメイン内で、ドメイン イベント ' Aggregate A updated ' のハンドラーを作成します。集計 B をフェッチし、その計算メソッドを呼び出してから、新しい計算結果を含む '集計 B 関数の結果が変更されました' イベントを発生させます。次に、読み取りモデルはこのイベントから結果を取得して、それ自体を更新できます。これでよろしいでしょうか?

イベントソーシングを使用していない場合に備えて注意してください。

この状況についてのご意見は大歓迎です。ありがとう!

更新: 状況をより具体的にする

私の集計はWorkers (集計 B) とGroupワーカーの s (集計 B) です。ワーカーとグループは多対多の関係です。Group と Worker の両方がValueプロパティを持っているとします。Worker'scalculateValue()は、Worker's Value と Worker が参加するすべてのグループの Values の関数です。上記の Command はValue、いくつかの Group に対して変更されています。その結果、グループに参加しているすべてのワーカーは、異なる結果を返しcalculateValue()ます。

読み取りモデルに何を求めていますか? 計算された値を持つワーカーのリストが必要です (ワーカーのすべてのグループからの値が既に考慮されています)。読み取り側にグループさえ必要ありません。「読み取り側で計算を行う」方法に進む場合、グループとそこにある関係の構造全体が必要です。不当な合併症になるのではないかと心配しています。

4

1 に答える 1