動易SiteFactory新特性體驗之旅——支持多數據庫
動易CMS 2007的新特性中有這樣一個非常重要的特性:
以下是引用片段: 支持多數據庫 動易CMS 2007采用了抽象工廠模式將各個不同數據庫的實現方式分離,理論上可以支持任意的數據庫,目前測試的版本只支持MS SQL 2000/2005。 不同數據庫的實現分離,就不用象原動易CMS 2006版那樣為了兼容AC和SQL兩種數據庫,必須使用標準SQL語句,并要注意兩種數據庫語句中的細小差異。分離后,各數據庫實現獨立出來,就可以靈活的利用各數據庫的優點(如:AC中可以使用SQL語句,而SQL中就可以靈活使用存儲過程、自定義函數、觸發器等特性),并且互相之間沒有干擾,可通過配置文件來實現快速切換。 |
這個新特性,我在上篇講N層架構設計的文章中已經附帶了講了一下。今天我們再來詳細的講一講,動易是如何實現這個特性的。
實現這個特性的前提是系統采用分層架構設計,然后在數據訪問層采用數據庫抽象工廠模式,將不同數據庫的實現抽象出來,然后通過修改配置文件,即可在不同數據庫類型間切換。
可能有些人迷糊了:動易CMS2006不也支持ACCESS和SQL兩種數據庫嗎?還有其他的系統不也是這樣嗎?這怎么能稱得上是動易CMS 2007的新特性呢?呵呵,大家別急,且聽我慢慢講來。
動易CMS2006是支持ACCESS和SQL兩種數據庫,并且也是簡單的修改Conn.asp中的數據庫類型即可在ACCESS和SQL中切換。但是動易CMS2006的多數據庫實現方式與動易CMS2007是完全不同的。
我們先來看看動易CMS2006的多數據庫實現方式。我們來看一段動易CMS2006的源代碼:
Conn.Execute ("alter table PE_Admin add AdminPurview_" & rsChannel("ChannelDir") & " Int null")
Else
Conn.Execute ("alter table PE_Admin add COLUMN AdminPurview_" & rsChannel("ChannelDir") & " INTEGER")
End If
因為ACCESS和SQL在語法上稍微有些區別,并不能完全通用,所以在寫程序時就要特別注意兩者的區別,一不小心,就會出現錯誤。而且這種方式,在寫代碼時,要考慮到每一種數據庫的不同語法之處。每增加一種數據庫,就要重新修改幾千處查詢語句,工作量可想而知,而且在修改時極易出錯。
動易CMS2007則采用了全新的模式——數據庫抽象工廠模式。在數據訪問層(DAL)中,采用DAL Interface抽象出數據訪問邏輯,并以DAL Factory作為數據訪問層對象的工廠模塊。對于DAL Interface而言,分別有支持MS-SQL的SQL Server DAL和支持Oracle的Oracle DAL具體實現。而Model模塊則包含了數據實體對象。其詳細的模塊結構圖如下所示:
數據訪問層的模塊結構圖
在數據訪問層中,完全采用了“面向接口編程”思想。抽象出來的IDAL模塊,脫離了與具體數據庫的依賴,從而使得整個數據訪問層利于數據庫遷移。DALFactory模塊專門管理DAL對象的創建,便于業務邏輯層訪問。SQLServerDAL和OracleDAL模塊均實現IDAL模塊的接口,其中包含的邏輯就是對數據庫的Select,Insert,Update和Delete操作。因為數據庫類型的不同,對數據庫的操作也有所不同,代碼也會因此有所區別。
此外,抽象出來的IDAL模塊,除了解除了向下的依賴之外,對于其上的業務邏輯層,同樣僅存在弱依賴關系,如下圖所示:
業務邏輯層的模塊結構圖
上圖中BLL是業務邏輯層的核心模塊,它包含了整個系統的核心業務。在業務邏輯層中,不能直接訪問數據庫,而必須通過數據訪問層。注意圖中對數據訪問業務的調用,是通過接口模塊IDAL來完成的。既然與具體的數據訪問邏輯無關,則層與層之間的關系就是松散耦合的。如果此時需要修改數據訪問層的具體實現,只要不涉及到IDAL的接口定義,那么業務邏輯層就不會受到任何影響。畢竟,具體實現的SQLServerDAL和OracalDAL根本就與業務邏輯層沒有半點關系。
上述的三個模塊分別使用了三個獨立的項目來進行管理,編譯后就生成了三個相應的DLL,如下圖所示:
注意,在測試版中,因為還沒有提供對ACCESS和Oracle的數據庫支持,所以在上圖中我們沒有看到對應的Powereasy.AccessDal.dll和PowerEasy.OracleDal.dll。
用戶登錄
還沒有賬號?
立即注冊