問題タブ [domain-events]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - Aggregate、Prooph を使用した DomainEvent
認証後に HTML フィードをスクレイピングするアプリケーションを開発しています。これらの Web サイトはメール/パスワード認証のみをサポートしていますが、一部の統合では追加情報が必要になる場合があります。私の質問は、ドメインイベントと集計を作成するときに取得する必要がある具体的なものですか? Prooph を使用して、単一のエンティティ タイプのみを処理する単純な集計とドメイン イベントを作成しました。しかし今、集計とドメイン イベントがこれらのサード パーティの Web サイト スクレーパーに固有のものであるべきかどうか疑問に思っています。フィード スクレーパーごとにイベントを作成する必要がありますか?それとも、一般的なイベントと集計を作成する方が適切ですか? 各集計のプロパティは異なる場合があります。
次に、ドメインイベントに似たもの
それとも、単一の集計およびドメイン イベントを作成する方がよいでしょうか? 両方のウェブサイトが使用するもの。サポートされている Web サイトのリストは増えることに注意してください。
domain-driven-design - コマンド適用後にクロス集計計算関数を呼び出して読み取りモデルを更新する
私は 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 関数の結果が変更されました' イベントを発生させます。次に、読み取りモデルはこのイベントから結果を取得して、それ自体を更新できます。これでよろしいでしょうか?
イベントソーシングを使用していない場合に備えて注意してください。
この状況についてのご意見は大歓迎です。ありがとう!
更新: 状況をより具体的にする
私の集計はWorker
s (集計 B) とGroup
ワーカーの s (集計 B) です。ワーカーとグループは多対多の関係です。Group と Worker の両方がValue
プロパティを持っているとします。Worker'scalculateValue()
は、Worker's Value と Worker が参加するすべてのグループの Values の関数です。上記の Command はValue
、いくつかの Group に対して変更されています。その結果、グループに参加しているすべてのワーカーは、異なる結果を返しcalculateValue()
ます。
読み取りモデルに何を求めていますか? 計算された値を持つワーカーのリストが必要です (ワーカーのすべてのグループからの値が既に考慮されています)。読み取り側にグループさえ必要ありません。「読み取り側で計算を行う」方法に進む場合、グループとそこにある関係の構造全体が必要です。不当な合併症になるのではないかと心配しています。