質問
私たちは試しています CQRS. 。CustomerService (ドメイン サービス) が Customer が存在するかどうかを知る必要がある検証状況があります。顧客は電子メール アドレスによって一意です。Customer リポジトリ (汎用リポジトリ) には Get(id) と Add(customer) のみがあります。CustomerService は、顧客が存在するかどうかをどのように確認する必要がありますか?
解決
このブログ記事を見てみましょう:<のhref = "http://web.archive.org/web/20120111165641/http://bjarte.com/post/224749430/set-based-validation-in- -cqrsアーキテクチャ」のrel = "noreferrer"> CQRSアーキテクチャの中にセット・ベースの検証ます。
これは、この非常に問題に対処しています。それはCQRSに対処するために複雑な問題です。 Bjarteが示唆された既存顧客の電子メールアドレスのためのレポートデータベースを照会し、メールアドレスが見つかった場合に戻ってドメインモデルに(例えばCustomerEmailAddressIsNotUniqueCompensatingCommand
など)コンペンセコマンドを発行することです。その後、UndoCustomerCreationEvent
を含むことができ、適切なイベントを、オフに解雇することができます。
代替のアイデアのための上記のブログの記事のコメントを読みます。
アダムD. には、検証がドメイン懸念であることをコメントで示唆しています。その結果、あなたは顧客の作成を容易にして、イベント・ストア内のイベントによって水和されているサービスでReservedEmailAddressesを保存することができます。
私は完全にクリーンな感じ、この問題に対する簡単な解決策はありますかわかりません。私はあなたが思い付くものを知ってみましょう!
グッドラック!
他のヒント
この問題はそれほど複雑である必要はありません。
- UpdateCustomer コマンドを送信する前に、レポート ストアで顧客の一意性を確認してください。
- 電子メール アドレスの一意性を確保するための制約を DB に追加します。コマンドの実行時に例外を処理し、応答チャネルを使用してユーザーに通知を送信します。(したがって、レポート ストアに対して CustomerUpdated イベントが発生することはありません。
データベースは目的に応じて使用し、ORM の制限にとらわれないでください。
のUdi漢によるこのポスト http://www.udidahan.com/
:2009/12月9日/明確化-cqrs / には、次の段落が含まれていますは「また、我々は、コマンドを処理するために、クエリストアにアクセスする必要はありません - 必要とされているすべての状態は、自律コンポーネントによって管理されなければならない - 。それは、自治の意味の一部だ」の
私は、UDIのデータベースにユニーク制約を追加するだけで提案信じて。
しかし、あなたが上記の文に基づいて、それを行うように感じていない場合、私はちょうどリポジトリに「ByEmail」メソッドを追加し、それを行うことを示唆している - しかし、その後、再びUDIのおそらくより良い提案を持っているでしょう。ます。
は、私があまりにも遅くはないよ願って...しかし、我々は我々のプロジェクトで似たような状況に直面し、我々は実際にコマンド実行を傍受し、順番に取得するためにクエリを使用して、そのコマンドのために作成されたルールのセット、とそれを添付しますデータます。
この場合には、我々はコマンド「RegisterCustomerCommandは」RegisterCustomerCommandExecutorによって実行されようとしているときRuleEngineに取り込まれる名前、CustomerEmailMustBeUniqueRuleによってクラスを持つことができるようにします。電子メールIDが存在し、無効フラグを上げることによって、実行を停止した場合、このルール・クラスを見つけるために、データベースを照会する責任がある...