c# - 在同一个 Controller ActionResult 中运行我的存储库中的 2 个方法是否正确?

标签 c# asp.net-mvc linq repository-pattern viewmodel

我正在使用 ASP.NET 4.0 MVC 和 C# 创建一个商店,我对它还很陌生。

我已经开始创建显示特定类别产品的 View 页面。

在特定类别页面上,我想要产品列表,还想要类别名称及其从数据库中获取的相关描述。

目前我这样做的方式是在我的存储库中有两种方法:

  1. 使用字符串检索特定类别的产品列表
  2. 用字符串检索特定类别

然后我在一个 ActionResult 中使用这两个,然后将它们传递给 View 。

有没有一种方法可以从对数据库的 1 个方法调用中检索产品列表和类别名称、描述等,或者我是否正确地完成了?

提前感谢您的帮助。

我的代码如下:

存储库

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

}

存储 Controller

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

}

分类.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>

最佳答案

存储库的目的是将数据访问层与业务逻辑分离。当您选择通过类别实体检索产品时,您依赖于延迟加载,这是 Entity Framework 的一个实现细节。什么时候你会稍后决定切换到不同的数据访问层(例如手动创建的查询),可能是您不再拥有此功能。

第二个问题是,当您将大量功能放入一个存储库方法中时,这个方法的职责是什么就变得不清楚了。正如@Andrew Barber 所描述的,是的,您将获得很多小方法。然后可以将这些组合起来以产生有用的功能。当您选择创建更大的方法来返回更多结果时,您会遇到另一个问题。当返回例如的方法时三个或四个数据集,你会遇到这样的问题,当你只需要其中两个数据集中的一个或两个时,你要么创建一个新方法,它的功能不如原始方法,要么你将运行四个查询一两个就足够了。

存储库的小方法旨在在组合成更大的整体时产生有意义的结果。很多方法不一定有问题。您的代码看起来不错 :)。

关于c# - 在同一个 Controller ActionResult 中运行我的存储库中的 2 个方法是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4005790/

相关文章:

c# - 需要替换字符串中 anchor 标签的href

c# - ASP.NET MVC POST 在第一次尝试时无限期等待

c# - 以编程方式将 x509 证书上传到 azure 应用程序 list

c# - 使用 Linq 和 Lambda 包含默认值

c# - ASP.NET Web Api 2 中的异常处理

c# - 如何使用GPRS上传数据

asp.net-mvc - Ninject 返回对象的特定实例

asp.net - MVC 6 - TagHelper 选择

c# - 如何使用 LINQ to CRM 填充实体只读字段(ModifiedOn、Createdby 等)?

c# - Enumerable.Range - 什么时候使用它有意义?