0

私は EF クラスを持っています。それらのそれぞれについて、さまざまな DAL 機能 (get、set、order など) を備えたモデル (EF poco クラスからの継承なし) を作成しました。BLはコントローラーの中にあります。モデルの単一インスタンスではすべて問題ないように見えますが、データのリストを表示するにはバインドする必要があります。以下は、私がそれをどのように行ったかの例です。私はMVCが初めてで、それを行うのがベストプラクティスかどうかわかりません:

モデル:

public class CustomerWishlistModel
{
    static storeDataEntities db = new storeDataEntities();

    //Some properties of the model
    public int CustomerID { get; set; }

    public int ProductID { get; set; }

    public string ProductName { get; set; }

    public string BrandName { get; set; }

    public CustomerWishlistModel(){}

    //Get wishlists by customer
    public static List<CustomerWishlist> GetCustomerWishLists(int customerID)
    {
         return db.CustomerWishlists.Where(x => x.CustomerID == customerID).ToList();
    }

    //Convert wishlist to model
    public static CustomerWishlistModel GetWishListModel(CustomerWishlist thisWishList)
    {  
        CustomerWishlistModel thisWishListModel = new CustomerWishlistModel()
        {
            CustomerID = thisWishList.CustomerID,
            ProductID = thisWishList.ProductID,
            BrandName = thisWishList.Product.Supplier.BrandName,
            ProductName = thisWishList.Product.Name
       };

       return thisWishListModel;
    }
}

コントローラー:

[Authorize]
[HttpGet]
public ActionResult Index(string id)
{
    //Get all wishlists to current customer
    List<CustomerWishlist> thisWishList = CustomerWishlistModel.GetCustomerWishLists(int.Parse(id));

    //Get language from url
    Language thisLanguage = LanguageModel.GetLanguageByCulture(RouteData.Values["language"].ToString());

    if (Session["UserID"] != null && Session["UserID"].ToString() == id && thisWishList != null && thisLanguage != null)
    {
        List<CustomerWishlistModel> thisWishlistModel = new List<CustomerWishlistModel>();

        //Get all wishlists that their status is online and language equals to current
        foreach (CustomerWishlist item in thisWishList)
        {
            if (item.Product.Status == (int)EnumModel.ProductStatus.Online && item.Product.LanguageID == thisLanguage.ID)
            {
                thisWishlistModel.Add(CustomerWishlistModel.GetWishListModel(item));
            }
        }

        return View(thisWishlistModel);
    }
    else
    {
        return RedirectToAction("Login", "Customer");
    }
}

景色:

@model IEnumerable<Store.Models.CustomerWishlistModel>
@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = Resources.Store.WishList;    
}
@using (Html.BeginForm())
{
    <h2>@Resources.Store.WishList</h2>

    foreach (Store.Models.CustomerWishlistModel item in Model.ToList())
    {
         item.BrandName...... and other markup tags
    }
}
4

1 に答える 1

3

ベスト プラクティスは、コントローラーからビジネス ロジックを削除することです。それらは、適切なサービスの呼び出しとモデル データのビューへの受け渡しを処理することのみを想定しています。モデルにはデータ アクセス コードを含めないでください。代わりに、収集データを別のクラスに抽象化し、クリーンなモデルを返すことをお勧めします。たとえば、DAL を抽象化する最も一般的なパターンの 1 つは、 のような単純なインターフェイスを介してデータを返すリポジトリ パターンですCustomer CustomerRepository.GetCustomer(int id)

すべてのビジネス ロジックは、リポジトリを呼び出して必要なデータを取得し、ビジネス ルールに基づいてデータを処理するサービス内にも含まれている必要があります。サービスは、コントローラーがビューに渡すクリーンなモデル オブジェクトを返します。シンプルでクリーン。

于 2013-02-11T22:39:59.320 に答える