33

Facility集約ルートのリストを含むかなり単純なドメイン モデルがあります。ドメインから発生したイベントを処理するために CQRS とイベント バスを使用している場合、セットの検証をどのように処理できますか? たとえば、次の要件があるとします。

  1. Facilityには固有の名前が必要です。

クエリ側で最終的に整合性のあるデータベースを使用しているため、イベント プロセッサがイベントを処理する時点で、データベース内のデータが正確であるとは限りません。

たとえばFacilityCreatedEvent、クエリ データベースのイベント処理キューで、処理されてデータベースに書き込まれるのを待機しています。新規CreateFacilityCommandが処理されるドメインに送信されます。ドメイン サービスは読み取りデータベースにクエリを実行して、その名前で既に登録されている他の があるかどうかを確認しますが、まだ処理されておらず、ストアに書き込まれていないFacilityため、false を返します。CreateNewFacilityEvent新しいものCreateFacilityCommandは成功しFacilityCreatedEvent、イベント プロセッサがそれをデータベースに書き込もうとしてFacility、その名前の別のものが既に存在することを発見すると爆発する別のものをスローします。

4

4 に答える 4

20

私が行った解決策は、現在の名前Systemのリストを維持できる集約ルートを追加することでした。Facility新しい を作成するときFacilityは、System集約 (Systemグローバル オブジェクト/シングルトンとして 1 つだけ) をそのファクトリとして使用します。指定された施設名が既に存在する場合は、検証エラーがスローされます。

これにより、検証の制約がドメイン内に保持され、最終的に整合性のあるクエリ ストアに依存しなくなります。

于 2010-06-23T18:25:06.540 に答える
2

この場合、基本的に主キー制約を使用して Sql テーブルに挿入する単純な CRUD スタイル サービスを実装できます。

挿入は一度だけ行われます。一度しか存在しないはずの同じ値を持つ重複コマンドが集約にヒットすると、集約はサービスを呼び出し、サービスは主キー制約の違反により挿入操作に失敗し、エラーをスローし、プロセス全体が失敗し、イベントは発生しません。生成され、クエリ側でのレポートはありません。おそらく、ユーザーがコマンド処理のステータスを知るためにクエリを実行できる結果整合性チェックのテーブルでエラーがレポートされます。それを確認するには、Command Guid を使用してコマンド ステータス ビュー モデルを何度もクエリします。

明らかに、コマンドが主キー チェック用のテーブルに存在しない値を保持している場合、操作は成功です。

主キー制約のテーブルはサービスとしてのみ使用する必要がありますが、イベント ソーシングを実装したため、イベントを再生して主キー制約のテーブルを再構築できます。

于 2015-01-17T14:26:53.447 に答える