Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 如何保持存储库类精简?_Design Patterns_Repository_Repository Pattern - Fatal编程技术网

Design patterns 如何保持存储库类精简?

Design patterns 如何保持存储库类精简?,design-patterns,repository,repository-pattern,Design Patterns,Repository,Repository Pattern,我已经阅读了很多关于存储库、通用存储库、UoW等和替代品的文章。似乎每个人对他们都有自己的看法。有人说不要使用通用回购协议,因为这是一种不必要的抽象。其他人说UoW也是一个不必要的抽象概念。有些人说,将公共功能放入基类,repo就可以从基类继承 我想知道什么是保持存储库轻巧和精简的最佳方法——即避免像两年前Romalaska中的FindAllowerss这样的高度专业化查询的激增 我看到的一个选项是返回IQueryables,并在服务层中执行任何附加过滤 此外,查询命令似乎是避免上述查询发生的另

我已经阅读了很多关于存储库、通用存储库、UoW等和替代品的文章。似乎每个人对他们都有自己的看法。有人说不要使用通用回购协议,因为这是一种不必要的抽象。其他人说UoW也是一个不必要的抽象概念。有些人说,将公共功能放入基类,repo就可以从基类继承

我想知道什么是保持存储库轻巧和精简的最佳方法——即避免像两年前Romalaska中的FindAllowerss这样的高度专业化查询的激增

我看到的一个选项是返回IQueryables,并在服务层中执行任何附加过滤

此外,查询命令似乎是避免上述查询发生的另一种方法。只是想寻找一些关于保持回购协议轻量化的指导


希望这不会成为一个基于观点的线程

如果您真的需要它,那么总是有一种模式,这就是Hibernate的Criteria查询所使用的模式

OrderQuery query = new OrderQueryBuilder()
                          .whereDate(from(2012))
                          .whereLocation(eq("Alaska"))
                          .build();

Stream<Order> orders = orderRepository.findAllThatMatch(query);
orderqueryquery=neworderquerybuilder()
.日期(自2012年起)
.地点(等式(“阿拉斯加”))
.build();
流订单=orderRepository.FindAllAtMatch(查询);

但是,除非您需要执行大量的特别查询,否则很少需要它。看看你需要编写的所有代码,以支持这一个查询!从努力的角度来看,只向存储库添加更多方法通常更好。

我看不出在DAO中避免专用方法的意义。IMHO,DAO的3个主要目标是将数据访问逻辑与服务隔离(如果服务必须构建查询过滤器,则不再是这种情况),通过模拟DAO使服务易于测试(如果DAO只有通用方法,则不容易实现),并使数据访问逻辑易于测试(如果您必须在测试中重新构建查询过滤器,以确保它们在DAO实际执行时正常工作,则情况就不再如此了)@JBNizet,如果业务规则是这样的:如果文档不是六个月或更久,则无法删除文档。在这种情况下,我宁愿让服务层构建查询筛选器,因为它与逻辑绑定,而不是将逻辑传递给存储库中的specialize方法。@Ronald在这种情况下,DAO中所需要的就是它了是findById()方法。服务将调用它,查看它是否超过6个月,并删除它。但是,是的,编写DAO方法是为了参与业务逻辑,否则,它们将毫无用处。它们只实现此逻辑的数据访问部分。