在我填充数据query object之后,是否应该有一个执行查询的对象(填充的查询对象作为方法参数),或者对象应该自己执行查询吗?
答案 0 :(得分:2)
其他东西应该执行查询。
如果不是,则您违反了SRP,因为查询封装了查询规范和查询执行。
想想如何在LINQ-to-SQL中完成它。在LINQ-to-SQL中,您可以将表达式树视为表示查询规范,并由LINQ-to-SQL提供程序来解释表达式树并将其转换为SQL。
所以它应该在这里。如果您有查询对象也执行查询,那么您已将查询规范与您执行查询的位置相关联。相反,它们应该是分开的,以便查询对象可以在其他上下文中重用(查询数据库,查询内存中的集合等)。再次,这就是它在LINQ中的表现。表达式树可用于LINQ-to-SQL,LINQ-to-objects和LINQ-to-XML,无需更改。
答案 1 :(得分:1)
这里真正的问题是:如何查询(并可能枚举)数据源的责任是否属于查询对象?
答案通常可以在不同的框架/解决方案之间进行更改,但至少对我来说,查询对象应该表示您想要的数据应该符合的规范。这是它的主要责任。
它不应该知道如何通过任何可用的数据API来触摸数据库,而应该由服务/组件使用,它理解如何将查询对象映射到它正在使用的任何后备存储。
通过这种方式,您可以使用相同的查询对象来利用不同的数据源,并允许客户端创建查询规范对象并将其传递给服务器(可能比具有大量参数的服务器方法更好)。
如果改变了数据访问机制(例如从原始SQL到Hibernate),如果以这种方式完成(查询对象可能有很多不同的查询对象),查询对象就不会改变 - 只有负责映射的对象查询实际查询的对象需要更改