2010-06-10 228 views
5

我一直在設計一個數據庫訪問層,它允許我們在我們的程序中支持多個數據庫。最後,我們程序的用戶應能夠從一系列數據庫系統中選擇底層數據庫系統。一些小客戶可能對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 

不知怎的,我真的不被這個想法激動不已。

你有什麼想法來解決這個設計問題?

預先感謝您的時間和答案:)

乾杯

基督教

+0

令人擔心你關於設計的?這對我來說似乎是合理的(乍一看)。我想包含一些方法來確保你不能在'MySQLConn'上使用'AccessTools',但這是我能想到的唯一的方法。 – ChrisF 2010-06-10 10:45:42

+0

我認爲抽象方法很好。你能給出什麼有力的理由來違反奧卡姆剃刀和KISS原則,並創造出第二套足夠好的課程?我已經使用了您在六個項目中描述的第一個架構,並且從來沒有遇到任何問題。如果你堅持使用標準的SQL,那麼只需要很少的特定於DB的代碼即可。 – 2010-06-10 10:56:44

+0

@ChrisF:當我想到一個DatabaseConnection類時,我僅僅把它看作是連接本身,它使我能夠創建,打開和關閉連接。查詢所有的表名和其他數據庫系統的具體操作必須對連接做些事情(畢竟,它們是對它進行操作的),但我覺得它們不應該太緊密地連接到連接上。 – Christian 2010-06-10 10:57:28

回答

1

由於您沒有得到純度100%的點數,請遵循Swingline Rage的建議。你也可以通過重命名這個類來使它變得純粹;-)

唯一的問題是,如果你使用接口而不是抽象類和繼承,你不太可能被燒燬。接口可以相互繼承,但你可能不需要它。有點難寫,但你可以用同樣的方式使用它們。

http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx
Interface or an Abstract Class: which one to use?

「關於在基類共享代碼是什麼?」 - 如果您使用靜態類並調用它們,您可以保留DRY(在OO中使用某些過程技術並不是一項罪過)。在上面的堆棧溢出主題Q#2看起來很有趣,但我不能擔保。

3

不是一個抽象方法,爲什麼不實現一個檢索使用ANSI標準INFORMATION_SCHEMA意見表名,然後在不符合ANSI標準的供應商的DatabaseConnection實施中覆蓋它?

除此之外,從設計的角度來看,我沒有發現抽象方法的任何問題。

1

在我看來,在單獨的層次結構中定義數據庫操作是一個更好的想法。 我寧願將這些工具封裝在具體連接對象中,然後通過一個工廠獲取連接。

準確地說,執行任務中獲得所有的表名,調用將是這樣的:

ConnectionFactory(ACSESS).getConnection().getTools().fetchSchema();