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