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