2010-09-13 61 views
1

我正在編寫一個用於編目文件的應用程序,並將這些文件與元數據相關聯。一個相冊程序將是我想要做的一個很好的比較。試圖瞭解如何抽象我的數據訪問層

我想抽象出我的程序和存儲文件的文件系統之間的接口,以及存儲文件的元數據的數據庫。這是爲了允許模擬和單元測試。另外,我希望能夠創建我的工具的多個實現,可以利用不同的數據庫格式和/或文件系統結構。

例如,我創建了一個接口IFileSystemAdaptor,該接口用於讀取和寫入文件和相關元文件(縮略圖和附件)到文件系統。 IFileSystemAdaptor的實際實現決定文件的存儲位置和結構。

public interface IFileSystemAdaptor 
{ 
    void WriteFileData(string fileName, Stream data); 
    Stream ReadFileData(string filename); 
    void DeleteFileData(string filename); 
    void ClearAllData(); 
    void WriteMetaFileData(string filename, string path, Stream data); 
    Stream ReadMetaFileData(string filename, string path, Stream data); 
    void DeleteMetaFileData(string filename, string path); 
    void ClearMetaFilesData(string filename); 
} 

所以現在我試圖做一些類似的連接到數據庫。我有一個fairly complex structure of classes,我想讀取和寫入數據庫。我希望能夠實現連接到SQL Server數據庫的實現,以及另一個使用無服務器數據庫(如SQL Lite)的實現。

我該如何抽象我的類和數據庫之間的數據訪問層,以支持多種數據庫類型?另外我怎樣才能允許我的類中的繼承關係反映在數據庫中?我更喜歡遵循「class table inheritance」模式的數據庫格式(請參閱我的其中一個previous questions)。

回答

1

我只處理如何將數據訪問層抽象爲支持多個數據庫提供程序的程度。您可以使用.NET框架中的DbProviderFactory類,該框架使用Factory模式來提供底層數據庫組件的抽象。你需要配置一個連接字符串值和提供者名稱(比如System.Data.SqlClient,我認爲,對於SQL Server)。使用提供者名稱可以創建具體的工廠類,然後使用連接字符串創建連接對象,從中可以創建命令對象等。這將允許您編寫獨立於基礎數據庫提供者的數據訪問層。請注意,爲SQL Server設計的參數化查詢(例如)將使用名爲@parametername的參數,而其他數據庫引擎將使用不同的格式來指示參數。因此,儘管使用工廠數據庫對象的類型是正確的,但如果您打算支持不同的數據庫引擎,則需要仔細考慮查詢的文本。

3

爲什麼重新發明輪子?使用nhibernate

一切都已經爲你完成。您可以保留所有模型,並且切換數據庫引擎很容易。

我自己編寫了三種不同的DAL/ORMS,支持SQL Server,Mysql,postgresql和sqlite。但是現在我改用了nhibernate。讓所有事情都按照你想要的方式完成是不值得的。

如果你仍然想自己做,你必須記住,大多數數據庫已經將自己的「智能」功能添加到SQL,你必須處理。您需要閱讀SQL92標準並堅持這些數據類型。

在插入行時,您需要針對大多數數據庫引擎以不同方式處理主鍵的復原(某些引擎在插入行之前使用生成器獲取PK值,而其他引擎則使用函數來檢索插入後的PK值)

分頁是另一件事情,每個數據庫都有自己的實現。 Sql服務器更像是一個黑客。

+0

是的,我也得出這個結論。我當然不想重新發明輪子。我一直在尋找SubSonic,現在我正在考慮NHibernate。我遇到的一個問題是我想要選擇允許「Class Table Inheritance」(http://martinfowler.com/eaaCatalog/classTableInheritance.html)的解決方案。從我看到的亞音速總是希望將類中的所有屬性(繼承或不繼承)存儲在該類的相應表中。 NHibernate可以將繼承關係反映到不同的表中嗎? – 2010-09-14 22:26:44

+0

我這麼認爲。 nhibernate是.NET中最成熟的ORM之一。從2003年開始,它已經從Java Hibernate移植過來。看看這篇文章(不知道它是否有幫助):http://ayende.com/Blog/archive/2009/04/10/nhibernate-mapping-ndash-inheritance.aspx – jgauffin 2010-09-15 05:02:27

+0

你也可以看看流利的nhibernate如果你不想使用XML文件將你的表映射到你的類。 http://wiki.fluentnhibernate.org/Fluent_mapping#Subclasses – jgauffin 2010-09-15 05:08:35