C# 让我的存储库中的两个方法在同一控制器ActionResult中运行是否正确?
我正在用ASP.NET 4.0 MVC和C#创建一个商店,而且我对它相当陌生 我开始创建查看页面,显示特定类别中的产品 在“特定类别”页面上,我想要产品列表,还想要从数据库中获取类别名称及其相关描述 目前我这样做的方式是在我的存储库中有两种方法:C# 让我的存储库中的两个方法在同一控制器ActionResult中运行是否正确?,c#,asp.net-mvc,linq,repository-pattern,viewmodel,C#,Asp.net Mvc,Linq,Repository Pattern,Viewmodel,我正在用ASP.NET 4.0 MVC和C#创建一个商店,而且我对它相当陌生 我开始创建查看页面,显示特定类别中的产品 在“特定类别”页面上,我想要产品列表,还想要从数据库中获取类别名称及其相关描述 目前我这样做的方式是在我的存储库中有两种方法: 使用字符串检索特定类别的产品列表 使用字符串检索特定类别 然后在一个ActionResult中使用这两个选项,然后将它们传递给视图 是否有一种方法可以从对数据库的一次方法调用中检索产品列表和类别名称、描述等,或者我是否正确地执行了该操作? 谢谢你事先的
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);
}
}
public interface IStoreRepository
{
IQueryable<Product> FindProductsByCategory(string c);
Category FindCategory(string c);
}
StoreViewModel
public class StoreViewModel
{
public List<Product> Products { get; set; }
public Category Category { get; set; }
}
公共类StoreViewModel
{
公共列表产品{get;set;}
公共类别{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>
-
,
似乎不需要单独获取Category对象,因为您可以从其中一个项目引用它。但是,我认为像您这样做可能会很好,因为,例如,您的方法将涵盖一个类别目前没有任何项目的情况,无论出于何种原因。似乎您不需要单独获取类别对象,因为您可以从其中一个项目引用它。但是,我认为像您这样做可能会很好,因为,例如,您的方法将涵盖某个类别由于任何原因目前没有任何项目的情况。存储库的目的是将数据访问层与业务逻辑分离。当您选择通过category实体检索产品时,您依赖于延迟加载,这是实体框架的一个实现细节。当您稍后决定切换到不同的数据访问层(例如手动创建的查询)时,您可能不再拥有此功能
第二个问题是,当您将大量功能放入单个存储库方法中时,就不清楚该方法的职责是什么。正如@Andrew Barber所描述的,是的,你会得到很多小方法。然后可以将这些功能组合起来以产生有用的功能。当您选择创建返回更多结果的更大方法时,您会遇到另一个问题。当返回三个或四个数据集的方法出现问题时,当您只需要其中两个数据集中的一个或两个时,您要么要创建一个新方法,其性能不如原始方法,要么要运行四个查询,其中一个或两个查询就足够了
存储库的小方法是为了在组成一个更大的整体时产生有意义的结果。许多方法不一定是问题。您的代码看起来不错:)。存储库的目的是将数据访问层与业务逻辑分离。当您选择通过category实体检索产品时,您依赖于延迟加载,这是实体框架的一个实现细节。当您稍后决定切换到不同的数据访问层(例如手动创建的查询)时,您可能不再拥有此功能 第二个问题是,当您将大量功能放入单个存储库方法中时,就不清楚该方法的职责是什么。正如@Andrew Barber所描述的,是的,你会得到很多小方法。然后可以将这些功能组合起来以产生有用的功能。当您选择创建返回更多结果的更大方法时,您会遇到另一个问题。当返回三个或四个数据集的方法出现问题时,当您只需要其中两个数据集中的一个或两个时,您要么要创建一个新方法,其性能不如原始方法,要么要运行四个查询,其中一个或两个查询就足够了
存储库的小方法是为了在组成一个更大的整体时产生有意义的结果。许多方法不一定是问题。您的代码看起来很好:)。感谢您对我的问题的详细回答,为我澄清了一些事情。感谢您对我的问题的详细回答,为我澄清了一些事情。
<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>