C# と Razor で ASP.NET MVC3 を使用しています。アプリケーションのアーキテクチャは、データ アクセス レイヤー (EF クラス + リポジトリ)、サービス レイヤー、コントローラー、ビューモデル、ビューに分かれています。
2 つの EF クラスProducts(key ProdId) とProductCategories(key ProductCategoryId) があります。
これらは、 in class as external keyおよびin classで1対多の関係を介して関連付けられました。ProdCatIdProductsProductCategoryIdProductCategories
もちろん、 classから へのナビゲーション プロパティ もあります。hasCategoryProductsProductCategories
私はリポジトリクラスにメソッドを持っています:
public IQueryable<Products> GetAllProducts()
{
return productDB.Products;
}
ここで、対応するカテゴリのProductCategoryName(ではない) を含むすべての製品をビューに表示したいと考えています。ProdCatId私が使用するリポジトリでこの情報にアクセスするには (productDB は EF クラスです):
productDB.Products.Where(n => n.ProdId == prodId)
.Select(m => m.hasCategory.ProductCategoryName).First();
ビューでこの情報を取得するには、このコードをService Layerから使用するか、さらに悪いことにViewModelから使用する必要があります。ただし、この方法では、分離したいコンポーネント (サービス レイヤーと EF、または ViewModel と EF) 間の結合を作成します。
代わりに、この値をリポジトリ (メソッドstring GetProductCategory(int ProdId)) からサービス レイヤーに取得すると、 と一緒にGetAllProducts().ToList()2 つのオブジェクトが作成されます。
1) あList<Products>
2) あstring
これらの値を Controller に渡して ViewModel にラップするにはどうすればよいですか? ProductInfoこのデータをラップするクラスをサービス層に作成しますか? このソリューションは、 Controller、ViewModel、およびクラスProductInfoの間の結合を作成します。
カップリングを作成しないために行うべき正しいことは何ですか?