サービスレイヤーからEFクラスのプロパティにアクセスする方法
-
28-10-2019 - |
質問
C#とRazorにASP.NET MVC3があります。アプリケーションのアーキテクチャは、データアクセスレイヤー(EFクラス +リポジトリ)、サービスレイヤー、コントローラー、ビューモデル、ビューに分割されています。
私のサービスレイヤーから ProductServices
メソッドを呼び出します GetAllProducts
私のリポジトリによって公開されました ProductRepository
、次の署名があります。
IQueryable<Products> GetAllProducts()
したがって、内部 ProductServices
電話する (productRepository
のインスタンスです ProductRepository
):
var products = productRepository.GetAllProducts();
それは変数に浸透します products
. 。今、私は製品の名前にアクセスしたいと思います ProductName
から productServices
. 。この命令を使用する場合:
var productNames = products.Select(m => m.ProductName).ToList();
間に結合を作成しています Servicelayer そしてその EF (リポジトリのバイパス)。それは私が追加しなければならないことを意味します ProductRepository
署名のある方法:
IQueryable<string> GetAllProductsName()
ただし、アプリケーションに他の製品情報が必要なので、1つの方法を作成しますか productRepository
の各フィールドについて Product
クラス?私の理由は正しいですか?ありがとう
解決
これには2つの考え方があります、
- リポジトリは、データベースとの対話方法を明示的に定義し、しっかりと制御する必要があります。したがって、リポジトリ上のメソッドは列挙データを提供する必要があります
- リポジトリは、強力な結合を特定のDataSourceタイプに分割しますが、詳細で列挙されたデータセットを提供する必要はありません。
個人的に私は2番目にサブスクライブします。
私の気持ちは、リポジトリ内で過度に明示的になったとき、それはデカップリングメカニズムではなくビジネスロジックに変わるということです。リポジトリの実装により緊密にリンクされることを意味するので、私はこれが本当に好きではありません。
また、場合によっては、リポジトリがデータを列挙するのに適切な場所ではないと思います。たとえば、ページングとソートはUIの懸念であると思いますが、パフォーマンスの場合は、クエリが現在のページ/ソートにのみ関連するだけです。これは、UIにクエリコンピレーションに貢献させる必要があるか、リポジトリがページングと並べ替えを理解する必要があることを意味します。
承認されていないデータソースを提供することで、後でトラックの下に問題が発生し、できるだけ早くセットを列挙することが非常に重要であっても、あなたを開くことができます。
あなたが興味を持っているなら、私のリポジトリに対する私の見解は次のとおりです。 http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html 、すべてのコードもgithubにあります
他のヒント
メソッドProductTrepository.getAllProducts()を使用してリポジトリからすべての情報をロードするため、Productservicesにすべての情報があります。他のエンティティからより多くの情報が必要な場合は、新しいサービスでProductservicesを拡張する必要があります。
ただし、アプリケーションには他の製品情報が必要なので、製品クラスの各フィールドのプロデューストレポジトリに1つの方法を作成しますか?私の理由は正しいですか?ありがとう
この状況では、通常、リポジトリではなく、サービス用の拡張機能メソッドを作成します。リポジトリには通常、CRUDセットアップがあり、それ以上のものはありません。