0

C# と Razor で ASP.NET MVC3 を使用しています。アプリケーションのアーキテクチャは、データ アクセス レイヤー (EF クラス + リポジトリ)、サービス レイヤー、コントローラー、ビューモデル、ビューに分かれています。

Service Layer から、次の署名を持つRepository によって公開されProductServicesたメソッドを呼び出します。GetAllProductsProductRepository

IQueryable<Products> GetAllProducts()

したがって、ProductServices私は呼び出します(productRepositoryはのインスタンスですProductRepository):

var products = productRepository.GetAllProducts(); 

変数に値を設定しますproductsProductNameから製品の名前にアクセスしたいと思いますproductServices。この命令を使用する場合:

var productNames = products.Select(m => m.ProductName).ToList();

ServiceLayerEFの間の結合を作成しています (リポジトリをバイパスします)。つまりProductRepository、署名付きのメソッドに追加する必要があります。

IQueryable<string> GetAllProductsName()

しかし、私のアプリケーションでは他の製品情報が必要なので、クラスproductRepositoryのフィールドごとに 1 つのメソッドを作成する必要がありますか? Product私の推論は正しいですか?ありがとう

4

2 に答える 2

1

これについては2つの考え方があります。

  1. リポジトリは、データベースとの対話方法を明示的に定義し、厳密に制御する必要があります。したがって、リポジトリのメソッドは列挙されたデータを提供する必要があります
  2. リポジトリは、特定のデータソースタイプとの強い結合を断ち切りますが、詳細で列挙されたデータセットを提供する必要はありません。

個人的に私は2番目を購読します、ここに理由があります:

私の考えでは、リポジトリ内で過度に明示的になると、デカップリングメカニズムではなくビジネスロジックに変わります。これは、リポジトリの実装とより緊密にリンクされることを意味するため、私は本当に好きではありません。

また、場合によっては、リポジトリがデータを列挙するのに適切な場所ではないと思います。たとえば、ページングと並べ替えはUIの問題であると思いますが、パフォーマンスのために、クエリを現在のページ/並べ替えにのみ関連付ける必要があります。これは、UIがクエリのコンパイルに寄与するようにするか、リポジトリがページングと並べ替えを理解する必要があることを意味します。

列挙されていないデータソースを提供すると、後で問題が発生する可能性があります。提供したとしても、できるだけ早くセットを列挙することが非常に重要です。

リポジトリに関する私の見解に興味がある場合は、http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html、すべてのコードもgithubにあります。

于 2012-02-20T11:57:22.560 に答える
0

productRepository.GetAllProducts() メソッドを使用してリポジトリからすべての情報をロードするため、すべての情報が productServices にあります。他のエンティティからさらに情報が必要な場合は、productServices を新しいサービスで拡張する必要があります。

しかし、私のアプリケーションには他の製品情報が必要なので、Product クラスのフィールドごとに productRepository に 1 つのメソッドを作成する必要がありますか? 私の推論は正しいですか?ありがとう

この状況では、通常、リポジトリではなくサービス用の拡張メソッドを作成します。通常、リポジトリには CRUD セットアップがあり、それ以上のものはありません。

于 2012-02-20T13:47:32.463 に答える