2009-12-21 96 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