【问题标题】:Where does paging, sorting, etc go in repository pattern?存储库模式中的分页、排序等在哪里?
【发布时间】:2011-02-18 07:28:41
【问题描述】:

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

应该放到服务层还是放到控制器中,让控制器直接调用repository?控制器 -> 存储库显示为 here 用于 jquery 网格。

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

【问题讨论】:

  • Linq .Skip() 和 .Take() 还不够吗?您可以编写一个扩展方法 GetPage(int index[, int pageSize = 20]) 使其完整。

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


【解决方案1】:

如果您的存储库返回具体化序列(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&lt;T&gt;

那里有许多PagedList&lt;T&gt; 实现。我喜欢Rob Conery's one。具有您的视图所需的属性,因此您可以绑定到 PagedList&lt;T&gt; 并创建一个 HTML 助手来非常轻松地呈现页码。任何分页列表 LINQ 实现的唯一问题是 Count() 操作(记录数)需要在服务器上完成,因此会导致 2 次往返。

您不希望将非物化查询返回到您的视图,因为 IMO 这打破了 MVC 模式。

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

【讨论】:

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

    【讨论】:

      【解决方案3】:

      排序和分页是数据功能。它应该进入存储库。

      【讨论】:

      • 所以我的存储库方法需要采用所有这些参数?
      • 我会这么说。传递正确的数据子集需要什么参数。实际上,这取决于您对架构的理念以及您想向它展示多少忠诚。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        Repositories and persistence ignorance again

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-16
          • 2011-06-03
          • 2011-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多