Fowler(ここ)によると、リポジトリは「ドメインとデータマッピングレイヤーの間を仲介し、メモリ内のドメインオブジェクトコレクションのように機能します」。したがって、たとえば、私のCourier Serviceアプリケーションでは、新しい実行が送信されると、アプリケーションサービスは新しいRun集約ルートオブジェクトを作成し、リクエストからの値を入力してからRunRepositoryに追加してから、作業ユニットを呼び出して保存します。データベースへの変更。ユーザーが現在の実行のリストを表示したい場合、同じリポジトリにクエリを実行し、情報を表す非正規化されたDTOを返します。
ただし、CQRSを見ると、クエリは同じリポジトリにヒットしません。代わりに、データストアに直接逆行し、常に非正規化される可能性があります。そして、私のコマンド側はNewRunCommandとHandlerに進化し、NewRunドメインオブジェクトを作成してデータを設定し、その情報をデータストアに永続化します。
したがって、最初の質問は、ドメインオブジェクトのメモリ内コレクション(必要に応じてキャッシュ)を維持していない場合、リポジトリはCQRSモデルのどこに適合するのかということです。
アプリケーションサービスに送信された情報に、ドメインオブジェクトを構築するためにサービスが解決する必要のある一連のID値しか含まれていない場合を考えてみます。たとえば、リクエストには、実行に割り当てられた宅配便のID番号が含まれています。サービスは、ID値に基づいて実際のCourierオブジェクトを検索し、AssignCourierメソッド(Courierを検証して他のビジネスロジックを実行する)を使用してオブジェクトをNewRunに割り当てる必要があります。
もう1つの質問は、クエリが分離され、リポジトリが存在しない可能性がある場合、アプリケーションサービスはCourierドメインオブジェクトを見つけるためにどのようにルックアップを実行するのでしょうか。
アップデート
デニスのコメントの後のいくつかの追加の読書と考えに基づいて、私は私の質問を言い換えます。
CQRSは、データアクセスおよびデータストレージメカニズムの単なるファサードであるリポジトリを推奨しているように思われます。それらはコレクションの「外観」を提供しますが(Fowlerが説明するように)、メモリ内のエンティティを管理していません(Dennisが指摘したように)。これは、リポジトリでのすべての操作がパススルーであることを意味しますね。
作業単位はこのアプローチにどのように適合しますか?通常、UoWはリポジトリに加えられた変更をコミットするために使用されます(右?)が、リポジトリがエンティティをメモリ内に維持していない場合、UoWにはどのような役割がありますか?
「書き込み」操作に関して、コマンドハンドラーは、同じリポジトリ、別のリポジトリ、またはリポジトリではなくUoWへの参照を持ちますか?