例:データベースに「CustomerOrdersOnHold」という名前のSQLビューがあります。このビューは、特定の顧客データフィールドと注文データフィールドのフィルタリングされた組み合わせを返します。アプリケーションのこのビューからデータをフェッチする必要があります。このようなビューへのアクセスは、リポジトリパターンにどのように適合しますか?「CustomerOrdersOnHoldRepository」を作成しますか?このような読み取り専用ビューは集約ルートと見なされますか?
3 に答える
読み取りリポジトリを分離することをお勧めします。できればその名前を Finder または Reader に変更することもできます。リポジトリは、読み取り専用データをクエリするためではなく、ドメインで使用するためのものです。 .
読み取りモデルを書き込みモデル アーキテクチャCQRSから分離することもお勧めします。
このアーキテクチャにより、データ ストレージとイベント ソーシングの使用に関しても、読み取りモデルを書き込みモデルから分離できます。
中間のソリューションについては、リポジトリをファインダーから分離するだけでデータベースを分離する複雑さなしに、いくつかの CQRS の概念を利用できます。この投稿を読んでください。
このタイプのソリューションのサンプル (同じデータベースを使用しますが、リポジトリからファインダーを分離します) については、このサンプルを確認してください
「CustomerOrdersOnHoldRepository」のように別途レポジトリを用意しても良いと思います。リポジトリのインターフェースは、オブジェクトが読み取り専用であるという事実を反映します (Save/Add/MakePersistent メソッドを定義しないことにより)。
リポジトリの書き方から:
... しかし、私が非常に気に入っている別の戦略があります: 複数のリポジトリです。この注文の例では、AllOrders と SurchargedOrders の 2 つのリポジトリを使用できる理由はありません。AllOrders はシステム内のすべての注文を含むリストを表し、SurchargedOrders はそのサブセットを表します。
返されたオブジェクトを集約ルートとは呼びません。集約は、一貫性、データ交換、およびライフサイクルのためのものです。オブジェクトにはこれらのいずれもありません。また、値オブジェクト (「特性または属性」) として分類できないようです。それらは単なるスタンドアロンのクラスです。
読み取り専用データは、DDD の世界では値オブジェクトと見なされます。
私は通常、別のリポジトリを作成することが理にかなうまで、値オブジェクトのアクセス メソッドを既存のリポジトリに配置します。これは、住所フォームで使用される州の静的リストを返すメソッドに似ています。
IAddressRepository
{
Address GetAddress(string addressID);
List<string> GetStates(string country);
}