質問

すべてのデータアクセスのリポジトリパターンから始まるマルチレイヤーアプリケーションがあり、サービスレイヤーにiQueryableを返します。すべてのビジネスロジックを含むサービスレイヤーは、ILISTをコントローラーに返します(注:UIレイヤーにASP.NET MVCを使用しています)。データアクセスレイヤーでiQueryableを返すことの利点は、リポジトリが非常にシンプルであり、データベースのクエリを延期できることです。ただし、サービスレイヤーのデータベースクエリをトリガーしているため、ユニットテストの信頼性が高くなり、クエリを再構築するためのコントローラーに柔軟性を与えません。しかし、私は最近、コントローラーがUI固有のデータにいくつかの予測を行う必要があるため、コントローラーへのクエリの実行を延期することが大幅にパフォーマンスがあったといういくつかの状況に遭遇しました。さらに、Odataのようなものの出現により、私はエンドポイント(Web UIまたはWeb APIなど)がiQueryableで直接作業できるのではないかと疑問に思い始めていました。あなたの考えは何ですか?サービスレイヤーからUIレイヤーにiQueryableを返し始める時が来ましたか?またはイリストに固執しますか?

ここのこのスレッド: iQueryableを返すu003CT>またはiQueryableを返しないでくださいu003CT>UIレイヤーにIlistを返すことを保証しているようですが、新しい新興のテクノロジーとテクニックのために物事が変化しているのではないかと思っていました。

役に立ちましたか?

解決

可能であれば、iQueryableインターフェイスに固執するのが好きです。唯一の問題は、次のようなものがある場合、コントローラーレベルで複雑なフィルタリングまたは再クエリを実行する場合です。

//DATA ACCESS
    public IQueryable<T> GetStudents()
    {
    return db.Students;
    }

そして、あなたのコントローラーでは、あなたのクライアントがその結果のいくつかのデータをフィルタリングしたいので、あなたはいくつかの再シャープをします、あなたは確かにコントローラーレベルでそれをするように誘惑されるでしょう:

var result = obj.GetStudents().Where(d=>d...);

そして、私にとっては大丈夫ですが、他のモジュールが同じフィルターを使用する必要がある場合はイメージングするだけで、コントローラーレベルでそれを呼ぶことはできません。ですから、私にとっては、乾燥した柔軟性とシステムがどれほどスケーラブルであるかのバランスのとおりです。完全にスケーラブルなシステムが必要な場合は、getStudents()メソッドを取得するには、一部または複数のオーバーロードを実行し、コントローラーレベルで再シャープを取り除く必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top