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