C# と Razor で ASP.NET MVC3 を使用しています。アプリケーションのアーキテクチャは、データ アクセス レイヤー (EF クラス + リポジトリ)、サービス レイヤー、コントローラー、ビューモデル、ビューに分かれています。
2 つの EF クラスProducts
(key ProdId
) とProductCategories
(key ProductCategoryId
) があります。
これらは、 in class as external keyおよびin classで1対多の関係を介して関連付けられました。ProdCatId
Products
ProductCategoryId
ProductCategories
もちろん、 classから へのナビゲーション プロパティ もあります。hasCategory
Products
ProductCategories
私はリポジトリクラスにメソッドを持っています:
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の間の結合を作成します。
カップリングを作成しないために行うべき正しいことは何ですか?