分页,排序等在存储库模式中的位置?

时间:2011-02-17 16:28:09

标签: asp.net-mvc asp.net-mvc-3 repository-pattern

我们在asp.net存储库模式项目中将数据分页和排序的逻辑放在哪里?

是应该进入服务层还是将其放入控制器并让控制器直接调用存储库?控制器 - >对于jquery网格,存储库显示为here

但与该文章不同,我的存储库返回IQueryable<datatype>

5 个答案:

答案 0 :(得分:22)

如果您的存储库返回实体化序列(ICollection<T>List<T>)等,它应该进入存储库。

但是如果你返回IQueryable<T>(就像我一样),我希望你的控制器和存储库之间有一个服务层,它在IQueryable上执行查询并将它们具体化为具体的集合。

所以,我会把分页放在服务层。

这样的事情:

public PagedList<T> Find(Expression<Func<T,bool>> predicate, int pageNumber, pageSize)
{
   return repository
             .Find()
             .Where(predicate)
             .ToPagedList(pageNumber, pageSize);
}

.ToPagedList可以是一种扩展方法,可将您需要的分页和项目应用于PagedList<T>

那里有很多PagedList<T>个实现。我喜欢Rob Conery's one。具有View所需的属性,因此您可以绑定到PagedList<T>并创建HTML帮助程序以非常轻松地呈现页码。任何分页列表LINQ实现的唯一问题是需要在服务器上执行Count()操作(对于记录数),因此导致2次往返。

您不希望将非实体化查询返回到您的View,因为IMO会破坏MVC模式。

每次进入新页面时,请致电您的服务以检索所需的结果。

答案 1 :(得分:3)

  • 排序:应在存储库中为大型结果集完成; 可以在控制器内完成小集合(即没有分页)。
  • 分页:IMO存储库应该公开一种返回集合片的方式(这与 paging 不完全相同)。意思是,应该有一种方法要求存储库返回一个查询,在索引z处开始以及下一个y项。然后,与特定页面大小(或页面索引)相关的所有内容都应保留在控制器内。这样您就可以优化数据检索,但不会将模型与特定的表示要求相结合。

答案 2 :(得分:2)

排序和分页是数据功能。它应该放在存储库中。

答案 3 :(得分:2)

存储库应该返回一个'PageableResultSet',或类似的东西,它负责分页。

答案 4 :(得分:0)

我相信分页应该放在存储库中。看到我在另一个问题上发布的这个答案。

Repositories and persistence ignorance again