ASP.Net MVC2中Controller和Repository之间的职责范围

sf.*_*sf. 2 asp.net-mvc-2

我试图了解如何使用存储库构建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)

djd*_*d87 7

你的第二个例子是你应该做的.存储库应处理所有数据访问.

控制器应该只获取已经过滤/排序的数据并将其传递给视图.控制器不应该对任何数据或业务逻辑负责.它应该只负责检索数据并传递它.

在控制器中编写代码时,我问自己这个问题;

如果我要在WinForms中编写这个应用程序,我是否必须再次编写此代码?

所以你IProductsRepository会拥有这个方法GetLatestPublishedProducts,然后你可以在你的方法中实现SqlProductsRepository.

职责是:

  • 存储库 - 从数据库中获取数据
  • Controller - 将数据传递给View进行渲染

然后,您可以更进一步,将任何业务逻辑分离出来,以便Controller本身避免使用存储库.因此,您将拥有位于Controller和Repository之间的第三个Service层.