我一直在設計一個數據庫訪問層,它允許我們在我們的程序中支持多個數據庫。最後,我們程序的用戶應能夠從一系列數據庫系統中選擇底層數據庫系統。一些小客戶可能對MS Access感到滿意,其他人則更喜歡MySql和其他DB2。那些數據庫系統是我現在想要的目標。數據庫層設計問題
鑑於這些要求,我想出了一個抽象類DatabaseConnection。在內部,我使用System.Data.Common.Data.DbConnection類,這已經給了我相當大的靈活性。
需要具體實例(OleDbCommand而不是DbCommand)的事物隱藏在像CreateDbCommand()這樣的抽象方法中。子類(如AccessDbConnection)實現這些並提供具體實例。目前,導致這個層次結構(簡稱爲便於閱讀,類名):
DatabaseConnection / | \ AccessConn MySqlConn DB2Conn
不過,也有一些操作所特有的底層數據庫系統,如檢索所有的表名。將一個抽象方法GetTableNames()放入DatabaseConnection-class並讓子類覆蓋它是不對的。
我想也許我可以創建另一個名爲DatabaseTools的抽象基類,在那裏聲明那些操作,然後在類似DatabaseConnection類的子類的子類中實現它們。這意味着對於一個AccessDbConnection,我也想有一個類AccessTools等等等等:
DatabaseConnection DatabaseTools / | \ / | \ AccessConn MySqlConn DB2Conn AccessTools MySqlTools DB2Tools
不知怎的,我真的不被這個想法激動不已。
你有什麼想法來解決這個設計問題?
預先感謝您的時間和答案:)
乾杯
基督教
令人擔心你關於設計的?這對我來說似乎是合理的(乍一看)。我想包含一些方法來確保你不能在'MySQLConn'上使用'AccessTools',但這是我能想到的唯一的方法。 – ChrisF 2010-06-10 10:45:42
我認爲抽象方法很好。你能給出什麼有力的理由來違反奧卡姆剃刀和KISS原則,並創造出第二套足夠好的課程?我已經使用了您在六個項目中描述的第一個架構,並且從來沒有遇到任何問題。如果你堅持使用標準的SQL,那麼只需要很少的特定於DB的代碼即可。 – 2010-06-10 10:56:44
@ChrisF:當我想到一個DatabaseConnection類時,我僅僅把它看作是連接本身,它使我能夠創建,打開和關閉連接。查詢所有的表名和其他數據庫系統的具體操作必須對連接做些事情(畢竟,它們是對它進行操作的),但我覺得它們不應該太緊密地連接到連接上。 – Christian 2010-06-10 10:57:28