我试图了解如何使用存储库构建ASP.Net MVC2 Web App.
我阅读的很多示例,教程和书籍都像这样构建了App:
public interface IProductsRepository
{
IQueryable<Product> Products { get; }
}
public class SqlProductsRepository : IProductsRepository
{
public Table<Product> productsTable;
public IQueryable<Product> Products
{
get { return productsTable }
}
}
public class ProductsController : Controller
{
IProductsRepository productsRepository;
public ProductsController(IProductsRepository productsRepository)
{
// set the Repository
}
public ActionResult GetLatestPublishedProducts(int pageSize, int page, ref int totalItemCount)
{
// Do LINQ query
return View(from p in productsRepository
where p.PublishedOn != null
orderby p.ProductId descending
select to(p))
.Skip((page - 1) * pageSize)
.Take(pageSize)
.ToList());
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白的一件事是为什么Linq查询存在于控制器中.
我想知道为什么做这样的事情是不正确的:
public class SqlProductsRepository : IProductsRepository
{
// set data model stuff here
public List<Product> GetLatestPublishedProducts(int pageSize, int page, ref int totalItemCount) {
// DO LINQ Query in here
}
}
public class ProductsController : Controller
{
// set repository stuff here
public ActionResult GetLatestPublishedProducts(int pageSize, int page, ref int totalItemCount)
{
return View(productsRepository.GetLatestPublishedProducts(pageSize, page, totalItemCount));
}
}
Run Code Online (Sandbox Code Playgroud)
你的第二个例子是你应该做的.存储库应处理所有数据访问.
控制器应该只获取已经过滤/排序的数据并将其传递给视图.控制器不应该对任何数据或业务逻辑负责.它应该只负责检索数据并传递它.
在控制器中编写代码时,我问自己这个问题;
如果我要在WinForms中编写这个应用程序,我是否必须再次编写此代码?
所以你IProductsRepository会拥有这个方法GetLatestPublishedProducts,然后你可以在你的方法中实现SqlProductsRepository.
职责是:
然后,您可以更进一步,将任何业务逻辑分离出来,以便Controller本身避免使用存储库.因此,您将拥有位于Controller和Repository之间的第三个Service层.
| 归档时间: |
|
| 查看次数: |
2765 次 |
| 最近记录: |