2009-12-21 54 views

回答

1

真正的问题在这里是:是否对如何查询(也可能枚举)数据源的责任属于查询对象?

答案往往不同的框架/解决方案之间变化,但至少对我来说,查询对象应该代表你想要的数据应符合什么样的规范。这是它的主要责任。

它不应该知道如何通过任何数据API可用,而是应该利用由服务/组件,它知道如何映射查询对象来使用任何后备存储已接触到DB。

通过这种方式,您可以利用不同的数据源和相同的查询对象,并允许客户端创建查询规范对象并将其传递给服务器(可能比拥有大量参数的服务器方法更好)。

如果修改了数据访问机制(如从原始SQL到Hibernate),那么如果以这种方式完成查询对象(查询对象可能会有很多不同的查询对象),那么查询对象将不得不进行更改 - 只有负责映射的对象查询对象实际查询将需要改变

2

别的东西应该执行查询。

如果没有您违反SRP作为查询封装查询的说明书和查询的执行。

想想它是如何在LINQ-to-SQL中完成的。在LINQ-to-SQL中,您可以将表达式树看作代表查询规范,并由LINQ-to-SQL提供者来解释表达式树并将其转换为SQL。

所以它应该在这里。如果您有查询对象也执行查询,那么您已经将查询规范与您执行查询的位置的细节联系在一起。相反,它们应该是分开的,以便查询对象可以在其他上下文中重用(查询数据库,查询内存中的集合等)。再次,这就是它在LINQ中的样子。表达式树可以在LINQ-to-SQL,LINQ-to-objects和LINQ-to-XML中使用,没有任何变化。

+0

我想similar.But Ayendes文章困惑我http://ayende.com/Blog/archive/2007/03/29/Query-Objects-vs.-Methods- On-The-Repository.aspx 他在查询对象上使用find方法。 – user137348 2009-12-21 15:22:09