問題タブ [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.

0 投票する
3 に答える
447 参照

domain-driven-design - ドメイン イベントに反応して集計をロードする

ドメイン駆動設計とイベント ソーシングを使用してアプリケーションを実装しています。すべてのドメイン イベントを SQL Server の DomainEvents テーブルに格納しています。

次の集計があります。

それぞれが独自のドメイン ロジックと不変条件をカプセル化します。1 つの都市には数千 (場合によってはそれ以上) の企業があり、企業には非常に多数の従業員がいる可能性があるため、それらを個別の集合体として設計しました。このエンティティが同じ集約に属する場合、それらを一緒にロードする必要がありましたが、ほとんどの場合、これは不要です。

Enable または Disable を呼び出すと、ドメイン イベント ( CityEnabledCompanyDisabledまたは などEmployeeEnabled) が生成されます。これらのイベントには、有効または無効なエンティティの主キーが含まれています。

今私の問題は、都市が有効/無効になっている場合、関連するすべての会社を有効/無効にする必要があるという新しい要件です。会社が有効化/無効化されている場合、従業員にも同じことが必要です。

たとえば、発生した場合に呼び出されるイベント ハンドラーでは、その都市に属する会社ごとCityDisabledに実行する必要があります。DisableCompanyCommand

しかし、その変化によってどの企業が影響を受けるべきかをどうやって知ることができるでしょうか?

私の考え:

  1. 「where CityId = event.CityId」のような条件を使用できないため、イベント ストアのクエリを実行できません。

  2. 親に子 ID を知らせ、親が生成するすべてのイベントにすべての子 ID を入れます。イベントの作成者は、後で誰がイベントを使用するかを気にする必要がないため、これも悪い考えです。そのため、発生中のイベントに属する情報のみがイベントに含まれている必要があります。

  3. を全社的に実施DisableCompanyCommand。一致する企業のみCityIdが状態を変更します。これを非同期で行ったとしても、これらのイベントですべての企業に大きなオーバーヘッドがかかることになります。また、すべての企業が無効化されるたびに、同じ手順を繰り返してすべてのユーザーを無効化する必要があります。

  4. ParentId を ChildId にマッピングする読み取りモデルを作成し、イベントの parentId に従って childId をロードします。これは最も適切な解決策のように思えますが、問題は、既存の会社を無効にしている間に、新しい会社が作成されたかどうかをどのように知ることができるかということです。

上記の解決策のいずれにも満足できません。基本的に問題は、発生したイベントの影響を受ける集計を特定することです。

多分あなたはより良い解決策を持っていますか?