2009-03-12 5 views
2

Linq2を使用すると、リポジトリがIQueryableを返すようにするのが良いでしょうか?Linq2NibernateとIQueryableを使用したインターフェイス設計

LinqをNibernateに使用すると、.First()やSingle()などの関数を呼び出すまでクエリが「起動」されないことを理解しています。ですから、IQueryableをすべてのインターフェースから返すのが最善ではないでしょうか?それで、それが起動する前に式ツリーを構築して操作できますか?

私のリポジトリはサービスによって呼び出され、IServicieから継承されます。

EDIT:

まず私は本当にすべての答えを感謝しています。しかし、私は質問に少し追加することを望む。私はこのデザインのためです。私はテストの周りの予約を完全に理解していません。プロセスがすべてのポイントIEでフィルタポイントごとにテストされている限り、私は実際にはほとんど違いが見られません。

追加:

は、あなたのリポジトリがIQuerrableを返さない場合Linq2Nibernateを使用する任意のポイントはありますか?

答えて

3

個人的にはそうは思わない。リポジトリから合成可能なクエリを公開する際の問題は、もはやそれらを完全に単体テストすることができないということです。その挙動(および成功)は、現在、呼び出し側の慈悲にかかっています。たとえば、.Where(x=>SomeUnmappedMethod(x))(変換なし)の場合があります。私はこれをhereに追加しました。

たとえば、IList<T>またはT[]を返す固定メソッドがある場合、単体テストで動作する場合は、実際の(設定エラーがない限り)動作するはずです。また、DALを孤立してプロファイルすることができ、SQL(その他)が実行されることを合理的に確信することもできます。呼び出し元に基づいて変更されるDALをプロファイル/最適化することはできません。 (私のLINQからSQLへの使用に基づいて、いないLINQツーNHibernateは特に)

+0

については、まだ読み込んでいない関係にアクセスしている発信者に公開されませんか? – eglasius

+0

あなたの言っていることを本当に感謝していますが、本当はLinq2Nibernateを十分に活用しているわけではありませんか?あなたが "パイプとフィルター"型のパターンを適用できない場合、私は実際にそれを使用することでどんな利益も見られません。PREデータベースのフェッチ –

+0

@Tedあなたはかなり類似した方法で動作することができる仕様パターンを使用します。これらのフィルタをメソッドに渡します(メソッドを呼び出した後にそれらを適用するのではなく) – eglasius

1

それはあなたの「リポジトリ」(理由は曖昧さの引用符)を消費しているものに依存します。あなたの最後の層(UI)のようなものがあなたのリポジトリクラスを消費している場合は、でないと言うでしょう。を返すと、IQueryableが返されます。しかし、UIレイヤーとデータアクセスレイヤーの間に別のレイヤーがある場合は、「はい」と答え、IQueryableを返し、中間レイヤーでクエリの実行を処理させます。あなたのデータアクセス層(DAL)/(文などがあれば)なしの試験にはほとんど存在しなければなりませんあなたは、実際のロジックを持っていない限り、私はほとんどの部分だと思いリポジトリをテストするためとして

EDIT

。その時点で、フレームワークをテストしています。私の提案は、ILLeryableクエリの実行を処理するBLLなどのアクセスレイヤー(UI)とDALの間に別のレイヤーを置くことです。そうすれば、リポジトリはクエリを返すことができ、BLLはそれらの実行を処理し、おそらくテストできるいくつかのロジックを実行することができます。

+0

この場合それはフレームワークをテストするのではなく、統合テストを行っています。つまり、現在のバージョンのデータベース、つまり誰かがそれを壊したチャンスを作っていないことを確認しています。そのための間違った見方 – eglasius

0

私はIQueryableをして行っていないが、私は少し違っを行う理由は、私が説明するだろう:

  • 簡単には、リポジトリを模擬すること
  • 統合テストを使用して、他のコードをテストするために - 最もクエリが実行される原因となるものはリポジトリにありますので、実際に集中的にテストすることができます
  • 最初に関連して、コードをチェックするのはリポジトリへの適切な呼び出しです。これは、呼び出しコードが結果に対してフィルタ情報を適用するのではなく、リポジトリメソッド呼び出しにフィルタ情報を渡すためです。
関連する問題