LINQ to SQL データ コンテキストをラップするリポジトリ クラスがあります。リポジトリ クラスは、すべてのデータ層ロジック (およびキャッシュなど) を含むビジネス ライン クラスです。
これが私のリポジトリ インターフェースの v1 です。
public interface ILocationRepository
{
IList<Location> FindAll();
IList<Location> FindForState(State state);
IList<Location> FindForPostCode(string postCode);
}
しかし、FindAll のページングを処理するために、ページングなどの状況に合わせてインターフェイスを簡素化するために、IList ではなく IQueryable<ILocation> を公開するかどうかを検討しています。
データ リポジトリから IQueryable を公開することの長所と短所は何ですか?
どのような助けでも大歓迎です。
ベストアンサー1
利点: 構成可能性:
- 発信者はフィルターを追加できる
- 発信者はページングを追加できる
- 発信者は並べ替えを追加できる
- 等
欠点: テスト不可能:
- リポジトリはもはや適切にユニットテスト可能ではありません。a: 動作していること、b: を信頼できません。何します;
- 呼び出し元が翻訳不可能な関数を追加する可能性がある(つまり、TSQL マッピングがなく、実行時に中断する)
- 呼び出し側は、犬のように動作するフィルター/ソートを追加できます。
- 呼び出し側は構成可能であることを期待しているため
IQueryable<T>
、非構成可能な実装は除外されます。または、独自のクエリプロバイダーを作成する必要があります。 - つまり、DALを最適化/プロファイルすることはできない。
安定のために、私はないリポジトリを公開したりIQueryable<T>
、Expression<...>
リポジトリで実行したりします。つまり、リポジトリの動作がわかっており、上位層では「実際のリポジトリはこれをサポートしているか?」 (統合テストを強制する) を心配せずにモックを使用できます。
私はまだIQueryable<T>
などを使用しています内部リポジトリ - しかし境界を越えてはいけません。私はいくつか投稿しましたこのテーマに関するさらなる考察はここリポジトリインターフェースにページングパラメータを設定するのも同様に簡単です。インターフェース上の拡張メソッドを使用して、オプションページング パラメータを使用すると、具体的なクラスには実装するメソッドが 1 つだけありますが、呼び出し元には 2 つまたは 3 つのオーバーロードが使用可能になる場合があります。