2011-04-26 33 views
10

DAO數據訪問對象是.NET中常用的模式嗎?我一直使用DAO作爲訪問我的數據層的方式。例如,我可能在我的EntityFramework ObjectContext上有一個精簡的接口,將我的所有ObjectSets公開爲IObjectSet。DAO模式在.NET中廣泛使用嗎?

複雜的查詢會被DAO公開,每個DAO都依賴於這個接口。我可能有一個ProductDAO,它公開的方法如GetProductsOnSale()GetInfrequenlySoldProducts()。然後,我的控制器或演示者將使用這些方法,這些方法可能是虛擬的,以允許爲單元測試存儲特定結果。

那麼這是.NET中常用的習語嗎?出於某種原因,我使用此模式在線看到的絕大多數示例均基於Java。 DAO最佳實踐中的this question甚至被標記爲Java而不是C#。

沒有什麼錯誤使用一些來自其他社區,我只是有輕微的擔心,我身邊的人做不同的事情......

回答

8

它是在.NET中常見的成語。我已經使用它,並已經看到它在很多地方使用。

它構建在框架中 - 請參閱System.Data名稱空間 - 許多類是專用提供程序(SQL Server,Oracle,MySQL等)的基類,操作在基類上執行。

但是,您所描述的聽起來更像我的​​,而不僅僅是使用Data Access Objects

這也用於許多項目,但沒有內置到框架中。

+0

我的理解是存儲庫是公開所有IObjectSet 成員的「事物」,而DAO是使用存儲庫構建查詢的類。這與您使用這些術語的方式是否一致? – 2011-04-26 19:32:05

+1

@Adam - 實際上,'DAO'是實際的數據庫接口,'Repository'是對'DAO'的使用進行抽象以表示所謂的「內存」集合。 – Oded 2011-04-26 19:33:57

+0

我明白了。你會調用那些需要一個存儲庫實例並暴露覆雜查詢的對象?當然這不是一個好主意,只是將所有可能的衆多quueries轉儲到您的存儲庫中...我會想象事情變得非常混亂 – 2011-04-26 19:36:29

1

我廣泛使用DAO模式。

您提到了實體框架;我想補充一點,我發現DAO比DataSets和DataTables好得多,它們太像數據庫了,不像我的口味對象。例如,DataRows不能添加到多個數據表中,因此我無法將加載數據的子集傳遞給不同的對象,而無需將它們移動到不包含它們的容器中。 (也就是說,DataRow看起來應該在DataTable中,但它們一次只能在一個DataTable中)。DataRowView很笨重,並不像將實體對象添加到另一個列表那樣直觀。

1

我最大的建議是使用Repository模式來封裝數據訪問(這確實是一個很好的模式),就是能夠創建一個通用的存儲庫。但是要創建一個非常智能的通用存儲庫,可以讓您基本實時佈線以便立即訪問所有標準CRUD操作,並可訪問複雜的查詢構造,您不會暴露過去的門面。

關於使用通用存儲庫最重要的是,您希望它基於構造函數注入而不是基於繼承。通過這種方式,您可以編寫SomeService以依賴於實現有意義的業務領域邊界所需的許多通用存儲庫。

我寫了一個關於這個概念的深度博客。 Creating a common generic and extensible NHiberate Repository version 2。雖然這篇博文是NHibernate的參考文獻,但您可以採用相同的核心概念並將其應用於幾乎所有的DAO

請注意一些工具,比如實體框架,Linq2Sql和RavenDB等等,它們自己公開了非常精緻的存儲庫,可能不一定會從添加額外的包裝器中受益。