Правильно ли иметь 2 метода из моего репозитория на одном контроллере ActionResult? - PullRequest
2 голосов
/ 23 октября 2010

Я создаю магазин с ASP.NET 4.0 MVC и C # и довольно плохо знаком с ним.

Я пришел к созданию страницы просмотра, на которой отображаются товары определенной категории.

На странице конкретной категории я хочу иметь список продуктов, а также хочу, чтобы название категории с соответствующим описанием было взято из базы данных.

В настоящее время я сделал так, чтобы в моем репозитории было два метода:

  1. Получить список товаров для определенной категории со строкой
  2. Получить определенную категорию с помощью строки

Затем я использую оба из них в одном ActionResult и затем передаю их в представление.

Есть ли способ, с помощью которого я могу получить список продуктов и название категории, описание и т. Д. Из 1 вызова метода в базу данных или я правильно сделал? Спасибо за любую помощь заранее.

Мой код выглядит следующим образом:

StoreRepository

public class StoreRepository : topsports.Models.IStoreRepository
{
    private topsportsEntities db = new topsportsEntities();

    public IQueryable<Product> FindProductsByCategory(string c)
    {
        var products = from p in db.Products
                       where p.Category.Name == c
                       select p;

        return products;
    }

    public Category FindCategory(string c)
    {
        return db.Categories.SingleOrDefault(cg => cg.Name == c);

    }
}

IStoreRepository

public interface IStoreRepository
{
    IQueryable<Product> FindProductsByCategory(string c);
    Category FindCategory(string c);

}

StoreController

 public class StoreController : Controller
{
    IStoreRepository storeRepository;

    public StoreController()
        : this(new StoreRepository())
    {
    }
    public StoreController(IStoreRepository repository)
    {
        storeRepository = repository;
    }

    public ActionResult Index(string c)
    {
        var category = storeRepository.FindCategory(c);

        var products = storeRepository.FindProductsByCategory(c).ToList();

        var viewModel = new StoreViewModel
        {
            Products = products,
            Category = category

        };

        return View(viewModel);
    }
}

StoreViewModel

public class StoreViewModel
{
    public List<Product> Products { get; set; }
    public Category Category { get; set; }

}

Category.aspx

<h2><%: Model.Category.Name %></h2>

<p><%: Model.Category.Description %></p>


<ul>
    <% foreach (var item in Model.Products) { %>
        <li>
            <%: item.Name %>, 
            <strong><%: item.Description %></strong>
        </li>
    <%} %>
</ul>

Ответы [ 2 ]

0 голосов
/ 24 октября 2010

Цель репозиториев - отделить ваш уровень доступа к данным от вашей бизнес-логики.Когда вы выбираете получение продуктов через сущность категории, вы зависите от отложенной загрузки, которая является подробностью реализации структуры сущности.Когда вы, например, позже решите переключиться на другой уровень доступа к данным (например, запросы, созданные вручную), возможно, у вас больше не будет этой возможности.

Вторая проблема заключается в том, что когда вы кладете многофункциональность в единый метод хранилища, становится неясно, какова ответственность этого метода.Как описывает @Andrew Barber, да, вы получите множество маленьких методов.Затем они могут быть объединены для получения полезной функциональности.Когда вы решите создать более крупные методы, которые будут возвращать больше результатов, вы получите другую проблему.Когда метод, который возвращает, например, три или четыре набора данных, вы получаете проблемы, которые, когда вам нужно только один или два из двух этих наборов данных, вы либо создадите новый метод, который будет меньше, чем исходный, или высобираемся выполнить четыре запроса, где одного или двух было бы достаточно.

Маленькие методы хранилища предназначены для получения значимых результатов при объединении в большее целое.Многие методы не обязательно являются проблемой.Ваш код выглядит отлично:).

0 голосов
/ 24 октября 2010

Может показаться, что вам не нужно отдельно получать объект Category, поскольку вы можете ссылаться на него из одного из элементов.Тем не менее, я думаю, что было бы неплохо сделать это так, как вы, потому что, например, ваш метод будет охватывать случай, когда у категории нет элементов в данный момент по любой причине.

...