IQueryableを返すには またはIQueryableを返さない [終了] 質問する

IQueryableを返すには またはIQueryableを返さない [終了] 質問する

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 つのオーバーロードが使用可能になる場合があります。

おすすめ記事