2013-02-11 3 views
0

У меня есть классы EF, для каждой из них я сделал модель (без наследования от классов EF poco) с различными функциональными возможностями DAL (get, set, order и т. Д.). BL будет внутри контроллеров. Все выглядит отлично для одного экземпляра модели, но теперь мне нужно привязать для просмотра списка данных. Ниже приведен пример того, как я это сделал. Я новичок в MVC и не уверен, что это лучшая практика, чтобы сделать это:ASP.NET MVC ViewModel для наилучшей практики коллекций

Модель:

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"); 
    } 
} 

The View :

@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 
    } 
} 
+1

Что конкретно вы спрашиваете? «Лучшая практика», для какой части? Вид? Контроллер? Ваш BL? Как вы передаете данные из BL на ваш взгляд? Тот факт, что вы используете 'IEnumerable' ?! –

+0

Передача IEnumerable на вид –

ответ

3

Лучшей практикой является удаление любой бизнес-логики с ваших контроллеров, они только предполагают обрабатывать вызовы соответствующих служб и передавать данные модели в представление. У вас не должно быть кода доступа к данным, и вместо этого лучше абстрагировать сбор данных в другой класс и вернуть чистую модель. Например, один из самых популярных шаблонов для абстрактного DAL - это шаблон репозитория, который возвращает данные через простой интерфейс, например, Customer CustomerRepository.GetCustomer(int id).

Вся ваша бизнес-логика также должна содержаться внутри служб, которые будут вызывать репозитории для получения требуемых данных и обработки данных на основе ваших бизнес-правил. Служба вернет чистый объект модели, который ваш контроллер перейдет к представлению. Простой и чистый.

+2

Я бы не сказал, что лучше использовать репозитории. Это, конечно, практика, и обычная. Но есть много способов, кроме репозиториев, которые так же распространены, как CQRS, Объекты запросов и т. П. Мне не нравится запрещать определенные шаблоны, которые часто бывают раз личных предпочтений, как «лучшая практика» –

+0

Действительная точка, я изменю свой ответ. – Sergey