6

私の質問は、CQRS (Command and Query Responsibility Segregation) と、読み取りモデル (ビュー) を構築するメカニズムに関するものです。私が理解している限り、読み取りモデルはイベント ハンドラーによって構築されます。これらのハンドラー (デノーマライザーとも呼ばれます) はドメイン イベントを受け取り、これらのイベントを使用してデータのさまざまなビューを構築します。

特定のイベントは、ドメイン モデルで行われた変更に関する情報を伝達します。この情報は、場合によってはビューを構築するのに十分ではないと思います-つまり、フィールドが変更されていない、変更されていないエンティティがそのようなイベントで欠落しているなどです。

だから私の質問は:

読み取りモデルの構築を担当するデノーマライザーがイベントだけでなく、以下にもアクセスすることは許可されていますか?

  1. イベントで直接参照されるエンティティが変更されましたか?
  2. 集約されたルートと、この集約に関連するエンティティを変更しましたか?
  3. リポジトリからフェッチされたエンティティはありますか?
  4. 任意のビュー?

イベント ハンドラー (デノーマライザー) に許可されている依存関係についてどう思いますか?

編集:上記の質問に簡単な例を追加しました:

次のモデルがあるとします。

AR: ProductOffering * 名前 * 説明 * カテゴリ * 価格

AR: 顧客 * 名前 * タイプ * メソッド: ProductPurchasedByCustomer イベントを発行する purchaseProduct(productOffering)

エンティティ: ProductInstance * 顧客 * productOffering

イベント: ProductPurchasedByCustomer * customerId * productOfferingId

ビュー: ProductInventoryView * customerId * productOfferingId * customerType * productOfferingName * productOfferingCategory * 価格

ProductPurchasedByCustomer イベントのみを使用して ProductInventoryView を構築する方法は? customerType、productOfferingName などに関する情報をビューに表示するデノーマライザーを作成するにはどうすればよいですか? 別のビューから customerType と productOfferingName に関する追加情報を検索する必要がありますか?

4

2 に答える 2

8

イベント コンシューマーがさらに情報を必要とする場合、イベント プロデューサーがその必要な情報を提供してもかまいませんが、その情報は変更されていません。イベントソーシングは ORM のように扱われるべきではありません。その情報を取得する方法に関しては注意が必要ですが、(まだ) 複雑にしないでください。イベントによって提供されない場合、イベントハンドラーは読み取りモデルの状態 (データ) を使用できます。ただし、そのためには、使用できるデータと使用できるデータを知る必要があります。時間をデータに結び付ける必要があります。メッセージ/イベントは順不同で処理される可能性があります。そのため、イベントに関する情報をイベントで提供することは、はるかに簡単です。他のことをする前にそれをやってみてください。読み取りモデルに固有のイベントハンドラーからドメインにアクセスしようとしないでください。これは厄介な結合です。最後にもう一つ、それは' イベントで必要なデータを提供するために、集計が他の集計からデータをコピーしてもかまいません。それ以降は、最初にコピーした集計でそのデータを最新の状態に保つ方法について考え始める必要があることに注意してください。おそらくあなたをもう少し混乱させました...

于 2010-12-19T00:55:01.827 に答える
0

私の理解によると:

イベントで直接参照されるエンティティが変更されましたか?

番号

集約ルートおよびこの集約に関連するエンティティを変更しましたか?

番号

ドメインリポジトリから取得されたエンティティはありますか?

番号

イベントに関係のないレポート

番号

イベントで直接参照されるエンティティのエンティティレポートを変更しましたか?

はい

集計ルートレポートと、イベントで参照される集計に関連するエンティティレポートを変更しましたか?

はい


デノーマライザーはドメインリポジトリについて何も知らず、関連するレポートのみを更新することになっているためです。

レポートが無関係のように見えても、更新する必要がある場合、それはコードのにおいです。モデル/レポートの設計が間違っている可能性があります。

于 2010-12-13T12:37:53.127 に答える