リポジトリが“平坦化”を担当する必要がありますかドメイン?
-
10-07-2019 - |
質問
免責事項:私はDDDとそれに関連する用語にかなり慣れていないので、概念に誤ったラベルを付けている場合は修正してください。
現在、比較的単純なドメインモデル(それぞれがCatalogImageアイテムのコレクションを格納するカタログアイテム)を使用するサイトで作業しています。
私のリポジトリは、 FindbyID(int ID)
GetAll()
などの標準インターフェースに従います...
IDで特定の画像を見つけようとすると問題が発生します。最終的に FindImagebyID(int CatalogItemID、int ImgID)
新しい要件が開発され、オブジェクトグラフがより深くネストされると、 Find {NestedType} ByID(int catalogItemID、.....、int nestedTypeID)
FindAll()メソッドからIEnumerableを返し、上位層でLinqを使用してこれらのクエリを作成するだけですか?それともSoC違反ですか?
解決
複数のリポジトリを構築する正当な理由があるように思えます。
例
interface CatalogRepository
{
Catalog FindByID(int ID);
}
interface CatalogImageRepository
{
CatalogImage FindByID(int ID);
}
各リポジトリはその特定のエンティティの処理方法を知ることのみを担当するため、これにより懸念が適切に分離されます。
他のヒント
必要に応じて、LINQを使用して、リポジトリの上のレイヤーでモデルをフィルタリングします。リポジトリをシンプルにします。 LINQを使用してデータベースからデータを取得する場合、この方法は非常にうまく機能します。ADOまたはその他のレガシーデータアクセスレイヤーを使用する必要がある場合、リポジトリを非常に単純にするのが難しくなる可能性があります。 Linqを使用すると簡単になり、リポジトリからIQueryableを返して、次のレイヤーでフィルタリングを追加できるようになり、要求されるまでデータの実際の取得は行われません。これにより、すべての画像を取得するGetImages()などのリポジトリ上のメソッドを使用でき、次のレイヤーは特定の画像のフィルタリングを追加します。 ADOを使用している場合は、おそらくすべての画像を元に戻してフィルターをかけたくないでしょう。