質問

ASP.NET MVCとリポジトリモデルを使用するプロジェクトに取り組んでいます。リポジトリクラスと、これらのリポジトリクラスを使用するサービスがあります。私の質問は、リポジトリクラスからIQueryableを返し、" .Where"を使用するのは正しいですか?および" .OrderBy"サービスでリストを生成しますか?はいの場合、それはベストプラクティスですか?

ありがとう!

役に立ちましたか?

解決

まず第一に、「正しい」ことはありません。または「間違った」ここに。それは、あなたとあなたが構築しているシステムに最適なものの問題です。たとえば、Rob Coneryは、あなたが説明しているパターンを正確に使用してStorefrontと呼ばれるASP.NETサンプルアプリケーションを実行し、大きな炎の戦争を引き起こしました。議論の大部分は、「オリジナルのもの」と見なされるリポジトリパターンを中心に展開されました。 Eric Evansの著書 Domain Driven Design で説明されており、インターフェースについて説明しています。 (インスタンスのリストの)実際のインスタンスを受け入れたり返したりするリポジトリとしてのリポジトリであり、クエリインターフェイスではありません。

理論についてはこれだけです。システムに何を選択しますか? IQueryableルートを直接選択しない理由は、実際には私の永続性戦略の一部がクライアント層(この場合はサービス層)に漏れているからです。 LINQ to [データベースアクセスメソッド(SQL、エンティティなど)]を使用してデータベースからオブジェクトを取得する場合、主にIQueryableを返すのが理にかなっているためです。そうして初めて、.Whereまたは.OrderByがクエリ結果を最適化します。 LINQ to Objectsを使用してリポジトリから公開する完全なリストを取得するデータベースアクセスコードコードを使用している場合、明らかに意味がありません。つまり、クライアントレイヤーを、使用しているLINQベースのデータベースアクセス戦略に結び付けます。

私は少し純粋主義者なので、リポジトリからLINQへのこの結びつきを見せたくないので、リポジトリの操作のパラメーターを通じてwhere-by-order-by基準を提供することを選択します。リポジトリで取得の最適化をすべて実行し、ドメインオブジェクトのきれいなセットを返すことができます。

最終的に、最終的には次のようになります。あなたにとって最適なものは何でも構いません。

他のヒント

なぜそれが問題になるのかわかりません。サービスレイヤーで取得するデータをより具体的にする場合は、アプリケーションとデータベースの間で転送されるデータが少ないことを意味します。つまり、効率が高くなります。そうすることは、遅延読み込みを実装するか、絶対に必要なときにデータを取得することも意味します。ウェブの無国籍性を考慮すると、これは良いことです。使用する可能性がある場合に備えて、すべてのデータを取得する必要はありません。

つまり、ユーザーのリスト全体を取得しても意味がありません。単に「Jackolantern」という名前のユーザーを選択するだけです

それを考える最良の方法はそうです-明日MSSQLからMySQLに切り替えることにした場合、ビジネスロジックを複製する必要がありますか?そうであれば、あなたはリポジトリが正しくありません。

はい、リポジトリがIQueryableを返すことにかなり満足していますが、1つの注意点があります。いくつかのLinq関数はすべてのプロバイダーで利用できるわけではありません。たとえば、Linq to Entitiesでは、Single / SingleOrDefaultメソッドは使用できません。そのため、使用するリポジトリの具体的な実装に応じて、サービス層でいくつかのフープをジャンプする必要があります。

通常、リポジトリクラスのインターフェイスをドメインレイヤーに配置し、実際の実装をサービスレイヤーに配置します。

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