asp.net - 谁应该负责对 Controller /域邮件服务/存储库进行分页?

标签 asp.net asp.net-mvc asp.net-core asp.net-core-mvc

我的问题对于专业人士来说可能看起来很奇怪,但请考虑到我来自 ruby​​ on rails world =)

所以,我正在学习 ASP.NET Core。与 Rails 相比,我喜欢我在其中看到的内容。但是总是有但是... 让我描述一下理论问题。

假设我有一个 Product模型。数据库中有超过9000条记录。很明显,我必须对它们进行分页。我已阅读 this文章,但在我看来这里出了点问题,因为 Controller 不应该使用 context直接地。它必须使用一些存储库(但为了简单起见,可能以这种方式提供该示例)。

所以我的问题是:谁应该负责分页? Controller 是否应该从存储库接收一些可查询的对象并只获取它需要的那些记录?或者应该是我自己的商业服务做同样的事情?或者存储库是否应该有类似 public IEnumerable<Product> ListProducts(int offset, int page) 的方法?

最佳答案

解决此问题的一个领域驱动设计解决方案是使用 Specification .规范设计模式描述了对象中的查询。因此,您可以创建一个 PagedProduct 规范,该规范将接受任何必要的参数(pageSize、pageNumber、filter)。然后,您的存储库方法之一(通常是 List() 重载)将接受 ISpecification 并能够产生给定规范的预期结果。这种方法有几个好处。该规范有一个您可以推理和讨论的名称(而不是一堆 LINQ)。它可以单独进行单元测试以确保正确性。如果您需要相同的行为(比如在 MVC View 操作和 Web API 操作上),它可以很容易地重用。

我在 Pluralsight Design Patterns Library 中介绍了规范模式.

关于asp.net - 谁应该负责对 Controller /域邮件服务/存储库进行分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42201113/

相关文章:

asp.net - MVC 6 - TagHelper 选择

.net - 在 ASP.Net MVC v1 下,是否调用了 Page_Load?

c# - 身份 View 在哪里?

azure - 无法在 Azure 应用服务部署中心选择 GitHub 组织

C#使用SMTP邮件发送邮件

javascript - 删除 <br/><br/> 标签并替换为 </p><p> 标签

c# - 在 Thread Local Storage/HttpContext Current Items 中存储数据

c# - 如何从一个存储过程填充多个 GridView 控件?

asp.net - 我的通用 ActionLink 去哪儿了?

asp.net-core - 在 IIS 上使用 Asp.Net Core 2.1.1 发布 Angular 6 应用程序