2009-06-28 112 views
13

我必須設計一個.NET數據訪問層,可能會使用多個數據庫管理系統(Mysql和Sql Server)以及相同的關係設計。數據訪問層設計模式

基本上,從一個數據庫切換到另一個數據庫非常簡單,所以我希望您推薦一些對您有用的網站或書籍,以及常用的設計模式或信息來實現此目的一種數據訪問層。

謝謝。

回答

12

我由Martin Fowler推薦企業應用架構模式。

模式的名單也對他website

DataMapper模式也有關。

+0

我目前正在閱讀這本書,我可以全心推薦它!它太棒了! +1 – 2009-08-12 08:44:42

0

我發現ADO.NET對此非常有用。它具有創建獨立於所用數據庫的數據訪問層所需的全部功能。

0

NHibernate被設計用來處理這種情況的,如果你願意去學習它

+0

標準的DataSet類也處理這種場景,不是嗎? – 2009-06-28 20:54:42

+0

是的,你是對的,但NHibernate爲你提供了更高層次的抽象(例如,你不再編寫SQL,但是當它變得可用時,使用NHibernate的內置查詢語言或LINC),並使得將數據模型移植到另一個數據庫引擎。 – oscarkuo 2009-06-28 21:03:50

2

最簡單的解決方案是使用ORM。檢出LLBLGen.使用適配器模型,您可以在使用相同業務對象的同時在數據提供者之間切換。它可以爲MySql和Sql Server生成代碼。

8

我喜歡使用基於接口的Db訪問。對於Ado.net每個DB提供程序實現基本的接口,當你使用這些代碼可能看起來像這樣:

public static IDbConnection GetConnection(string connectionName) 
{ 
    ConnectionStringSettings ConnectString = ConfigurationManager.ConnectionStrings[connectionName]; 
    DbProviderFactory Factory = DbProviderFactories.GetFactory(ConnectString.ProviderName); 
    IDbConnection Connection = Factory.CreateConnection(); 
    Connection.ConnectionString = ConnectString.ConnectionString; 
    return Connection; 
} 

然後,當你需要與數據庫進行通信:

public static DataTable Dummy() 
{ 
    using (IDbConnection Connection = GetConnection("SiteSqlServer")) 
    { 
    IDbCommand Command = Connection.CreateCommand(); 
    Command.CommandText = "DummyCommand"; 
    Command.CommandType = CommandType.StoredProcedure; 

    Connection.Open(); 

    using (IDataReader reader = Command.ExecuteReader()) 
    { 
     DataTable Result = new DataTable(); 
     Result.Load(reader); 
     return Result; 
    } 
    } 
} 

利用這種技術你可以創建完全獨立於數據庫的DAL。當然對於一些複雜的情況來說這還不夠。但大多數情況下,這會做這項工作,而且你不需要各種外部庫。

2

一般來說,我第二次約翰諾蘭的推薦Patterns of Enterprise Application Architecture

更具體地說,我總是建議您將數據訪問層隱藏在接口後面,並使用依賴注入在運行時將特定的數據訪問組件注入到域邏輯中。

您可以使用依賴注入容器或do it manually

在技術方面,我會推薦微軟的Entity Framework,因爲您的數據訪問需求似乎受限於關係數據庫。實體框架是微軟官方的OR/M,它提供了許多不同的RDBMS以及LINQ支持。

1

這實際上取決於您的圖層的大小和您開發的產品的類型。如果它包含得很好,那麼ADO.NET可能是理想的。如果它是一個更大的DAL層,並且它的多目標DBMS的綠地開發,那麼最好使用ORM工具。它們是快速,高效和成熟的產品,並且可以通過簡單地更改單個參數快速啓用對另一個數據庫的重定向。編寫靜態ADO,是傳入遺留問題的東西。

有幾個ORM工具可以完成這項工作,所有工作都略有不同,並取決於您的預算,團隊規模等 。他們可以通過必須編寫像NHibernate這樣的映射類來工作,或者通過反射,即屬性標記。

免費,即開源,如果你的皮膚,NHibernate是理想的。目前我正在使用它來構建DAL層,以用於大型企業產品。它的優秀,但需要一些時間來掌握。使用NHibernate,你可以定義映射類,在執行時爲你生成db模型。它支持存儲過程。缺點是學習需要一些時間,尤其是在正確繪製複雜數據之前。它的優秀。它有大量的樣本和其他浮動的項目使用它。查看Koders.com。

如果你有一些預算,那麼LLBLGen是理想的。它是強類型的,並且還支持存儲過程。

如果已經有一些數據模型可用,那麼TierDeveloper是理想的。它本質上是免費的,並且通過從數據庫模型開發一組類來工作。唯一的缺點是mysql的映射器是第三方。這是一款免費支持ncache的企業級產品,也是一種可行的方法。

如果你急於堅持MS,他們正在走向ORM,並有一個名爲ADO.NET實體框架的產品。在功能上它不像上面定義的工具那麼完整。其成熟期大約落後3代。它在vs 2008 sp1中可用。 MySQL的連接器將是一個成本。

另外,你可以使用LINQ。如果您還需要連接器,它也會以mysql爲目標。

理想情況下,您最好的選擇是使用ORM。如果你不支持開源,並有預算, 然後得到

希望有所幫助。