2014-04-03 59 views
2

我有3個不同的DataModule:ADOModule,SDACModule,AstaModule。除了使用的數據庫組件,它們都是相同的:ADO,SDAC,Asta。數據庫組件或新組件的可視化繼承?

所有這些DataModules都執行相同的工作,但通過不同的組件。我的意思是 - 所有內部選拔和執行者都是一樣的。

我搜索的是:將所有這些DataModules結合到一個BaseDataModule,並強制每個ADOModule,SDACModule和AstaModule從BaseDataModule繼承的方法。

嗯,我發現很容易繼承方法和屬性,但我從來沒有用過從組件繼承。有沒有什麼好的方法可以做到這一點?項目目標:儘量減少編碼和複製粘貼。

+0

你不能用視覺繼承來做到這一點。您需要在運行時構建所有數據庫組件。無論如何,你應該這樣做。 –

+0

可能會有一些作弊嗎?我需要保存所有組件的方法,但只能更改db組件。 – notricky

回答

0

有幾種選擇給你,但我會採取的做法是如下: -

  1. 爲你的數據庫和查詢組件創建一個抽象基類。你的基類應該定義你將需要的所有方法和屬性。

  2. 爲每個數據訪問層創建具體的後代,這些後代有效地封裝了底層的數據訪問層。

  3. 將當前數據模塊代碼移入引用抽象組件類型而非任何特定類型的訪問層的非可視單元。

  4. 您現在可以輕鬆地在接入層之間切換,甚至可以在將來添加新層。

這是Adapter(或Wrapper)模式的經典示例。

如果您不想重新發明輪子,您可能需要考慮查看像tiOPF,InstantObjects或TMS Aurelius這樣的OPF/ORM解決方案,它們會爲您提供相同的功能以及更多功能。

+0

謝謝,那是我想方設法,但想知道是否有更好更簡單的解決方案。我真的不知道應該做什麼工作來重新編碼所有基類的東西。謝謝。 tiOPF,InstantObjects或TMS Aurelius - 我現在還沒有真正擁有過。 – notricky

+0

在面向多個數據庫平臺時,實現並付出實際並不困難。一旦你編寫了基類,你應該可以在下午編寫一個新的訪問層。 tiOPF中的代碼提供了一個非常好的例子來說明如何做到這一點。它是開源的,所以你可以看看代碼。 http://tiopf.sourceforge.net/Doc/Concepts/6_TheAdaptorForDatabaseIndependence.shtml –

1

允許我建議一條不同的路徑。我建議您編寫所有基於TClientDataset而不是其他任何特定數據集的DataModules。添加所需的所有屬性和方法,始終與TClientDataset實例配合使用。

然後創建一個數據訪問服務接口,比如說IDataProvider,它提供了選擇數據和執行SQL語句的方法。 select方法將接收查詢文本並返回將保存找到的所有記錄(Data內部TClientDataset的屬性)的OleVariant。當這個OleVariant分配給DataModule上的TClientDataset實例的Data屬性時,它將填充它。

最後,寫實現類到IDataProvider。這些類將依賴於您需要支持的特定數據訪問技術。

此架構將使您的應用程序完全獨立於數據訪問方法。未來,如果您需要第四種方式獲取數據,那麼您只需添加一個新的實現IDataProvider,其餘的將繼續工作。

如果您將這些實現類放在分離的包中,您將能夠通過dinamicaly加載這些包而不必重新編譯應用程序來使您的應用程序能夠使用不同的數據訪問方法。想想那是多麼美好!

+0

謝謝,我在考慮'TDataSet'的基礎,但它沒有視覺效果。而且據我所知,'TClientDataset'有一些缺陷和問題需要解決。也許有一個計劃,使用更好的嘗試數據集,它可能是?因爲這個想法比我更清楚,比@ Andy_D's – notricky