例:データベースには、 "CustomerOrdersOnHold"という名前のSQLビューがあります。このビューは、特定の顧客および注文データフィールドのフィルタリングされた組み合わせを返します。アプリケーションのこのビューからデータをフェッチする必要があります。そのようなビューへのアクセスは、リポジトリパターンにどのように適合しますか? "CustomerOrdersOnHoldRepository"を作成しますか?このような読み取り専用ビューは集約ルートと見なされますか?読み取り専用データベースビューはどのようにリポジトリパターンに適合しますか?
答えて
私はリポジトリを意味し、好ましくも、Finderやリーダーに社名を変更、読み取りリポジトリを分離することを好むだろう読み取り専用データを照会するドメインではなく、this articleとthisを参照してください。これは、Finderで区切られたフォームリポジトリの使用法を説明しています。
私はこのアーキテクチャは、あなたも、データストレージとイベントソーシングの使用条件での書き込みモデルからリードモデルを分離することを可能にする書き込みモデルアーキテクチャCQRSとthere
からも読み取りモデルの分離をお勧めします。
あなたがこの種のソリューションのサンプルのために、この postを読んで、ちょうどファインダーからリポジトリを分離することにより、データベースを分離する複雑させずに、いくつかのCQRSの概念を利用することができます真ん中解決のために
(同じデータベースを使用しますが、ファインダを分離フォームレポジトリ)チェックthis sample
"CustomerOrdersOnHoldRepository"のような別のリポジトリを持つことはいいと思います。リポジトリのインタフェースは、(Save/Add/MakePersistentメソッドを定義しないことによって)オブジェクトが読み込み専用であるという事実を反映します。 How to write a repositoryから
:
...しかし、それは、私はかなりのような別の戦略があります:複数の リポジトリは。注文例では、 2つのリポジトリ:AllOrdersとSurchargedOrdersを持つことができる理由はありません。 AllOrdersは を表し、SurchargedOrders はシステムのすべての単一注文を含むリストで、そのサブセットを表します。
返されたオブジェクトをAggrgate Rootと呼びません。集約は、一貫性、データ交換およびライフサイクルのためのものです。あなたのオブジェクトにはこれらがありません。彼らはまた価値オブジェクト( '特性や属性')として分類することもできないようです。彼らは単なる単体クラスです。
私は自分のリポジトリに独自のリポジトリを提供することに傾いていましたが、リポジトリは集約ルーツ(http://thinkddd.com/glossary/aggregate-root/)のみで動作すると私は理解しています。 –
このルールは、集約の内部部分への直接アクセスを回避することについてです。あなたは不変物やライフサイクルを持たないのと同じように、これらの内部部品を持っていません。これらのオブジェクトをリポジトリから戻すことはOKです。もしあなたが好きなら、それらを集団のルートと呼んでください。しかしそれは少し誤解を招くかもしれません。 – Dmitry
あなたの読み取り専用データは、DDD世界では値オブジェクトとみなされます。
私は通常、別のリポジトリを作成するようになるまで、既存のリポジトリにバリューオブジェクトのアクセスメソッドを配置します。これは、アドレスのフォームで使用する状態の静的リストを返すことがあります方法と似ています:
IAddressRepository
{
Address GetAddress(string addressID);
List<string> GetStates(string country);
}
あなたのシナリオでは、CustomerRepositoryまたはOrderRepositoryがある場合、これらのリポジトリのいずれかにメソッドを追加しますか?すなわち 'ICustomerRepository.GetCustomerOrdersOnHold(args)'または 'IOrderRepository.GetCustomerOrdersOnHold(args)'? –
これは最高の答えだと思います。このタイプのデータ/オブジェクトはドメインとは無関係であり、Mohamedは指摘したように、リポジトリという用語は集約/ドメイン/トランザクションに関連付けられているため、この用語の使用は誤解を招く可能性があります。 CQRSは、この正確な問題を解決することを目指しています。私は同様の質問をしばらく前に尋ねた:http://stackoverflow.com/questions/2098112/ddd-how-to-implement-performant-repositories-for-searching –
偉大なリンクのために素晴らしい答え。これは私のコードを別のより明確な視点から見る助けになりました。 –
Finderをお持ちの場合は、どのように「Saver」と名前を付けますか?リポジトリ?しかし、その後、リポジトリはAKAの "クエリ"にアクセスできるはずです...これに対処する方法は? – JorgeeFG