丁純立
(福建信息職業(yè)技術(shù)學(xué)院,福建 福州 350003)
隨著企業(yè)對信息化產(chǎn)品的依賴越來越強,相關(guān)的軟件產(chǎn)品的功能也越來越強大,軟件結(jié)構(gòu)越來越復(fù)雜,對于大型復(fù)雜的軟件系統(tǒng)來說,開發(fā)、維護成本高、重復(fù)開發(fā)率高、開發(fā)效率低越來越困擾著軟件開發(fā)者,尤其在進行團隊開發(fā)時情況更是嚴重。在此背景下,人們認識到對總體的系統(tǒng)結(jié)構(gòu)設(shè)計比起對計算的算法和數(shù)據(jù)結(jié)構(gòu)的選擇已經(jīng)變得更加重要。
為了克服上述問題,人們總結(jié)程序開發(fā)的經(jīng)驗,提出采用分層的方式進行處理,在分層軟件框架設(shè)計中最成熟的就是三層架構(gòu)的分層方案,即把系統(tǒng)從應(yīng)用邏輯上對其進行抽象細分用戶界面層(UI),業(yè)務(wù)邏輯層(BLL),數(shù)據(jù)訪問層(DAL)三個層次,同時再加上共用實體類和一些通用輔助類,如數(shù)據(jù)庫訪問類、事務(wù)處理類等。以上的設(shè)計提高了軟件代碼的復(fù)用質(zhì)量,但還存在許多問題,如缺乏安全管理,缺乏用戶登錄日志管理,各層之間的耦合度不能讓人滿意;在數(shù)據(jù)訪問層還是存在冗余代碼,工作重復(fù)現(xiàn)象,因此必須對三層架構(gòu)進行有效擴充才能滿足用戶需求。
文中將結(jié)合.NET平臺所提供的相關(guān)技術(shù),構(gòu)建出一個基于三層架構(gòu)設(shè)計思想、面向?qū)ο蟆⒖蓮?fù)用的信息系統(tǒng)軟件開發(fā)框架,下面進行具體分析。
1.用戶界面層:直接和用戶進行交互,把數(shù)據(jù)內(nèi)容呈現(xiàn)給用戶或接收用戶輸入的數(shù)據(jù)的部分。在一般的分層架構(gòu)解決方案中,表示層的設(shè)計是根據(jù)用戶所選的不同控件,將實體類的值綁定到對應(yīng)控件的屬性上,以完成數(shù)據(jù)的自動獲得與顯示。這種方法的缺點是,大型應(yīng)用程序都有非常多的頁面,對每個頁面進行控件與實體類屬性的對應(yīng),代碼量大且重復(fù)率高,隨著需求的變化,調(diào)整就更加繁瑣,為了解決上述問題,框架將用戶界面層分成了UI和UI控制邏輯層,在UI層設(shè)計了界面頁面的基類PageBase.cs,系統(tǒng)中的每個UI界面類都從PageBase.cs繼承,在 PageBase.cs中,定義了 ErrorMsg出錯提示,ErrorState出錯狀態(tài),ActionPage動作頁面,Action執(zhí)行動作等公共變量,讓每一個表示層頁面的操作與邏輯層的操作都有返回信息與狀態(tài),這樣不僅可以更好的控制和判斷程序,同時通過記錄每個頁面的公共變量值還可以實現(xiàn)應(yīng)用程序的異常管理,用戶登錄日志管理等功能,這些功能也是一個成功的框架中必不可少的重要組成部分。在UI控制邏輯層設(shè)計了一個公共類DORM.CS,用以將web頁面控件的值自動賦值到哈希表中,主要的設(shè)計思路是,通過獲取頁面上以“UI_”這個命名的控件,取相應(yīng)的控件名和值,分別保存在哈希表里面對應(yīng)的KEY、values里面,然后返回哈希表,以此來解決繁瑣的頁面控件與實體類屬性對應(yīng)操作的問題。
2.業(yè)務(wù)邏輯層:主要是處理業(yè)務(wù)方面的邏輯。在這一層中,框架將BLL層細分為業(yè)務(wù)邏輯接口層和業(yè)務(wù)邏輯實現(xiàn)層,在業(yè)務(wù)邏輯接口層抽象出了用戶界面層所需要用到的功能,并將這些接口統(tǒng)一放在DAO_Interface接口文件中,主要接口如圖1所示
圖1 業(yè)務(wù)邏輯接口
這一層可以讓團隊成員獨立開發(fā)而減少相互間的依賴性。就是說業(yè)務(wù)邏輯實現(xiàn)層里還沒寫實現(xiàn)過程的時候,項目組的其它成員,可以先調(diào)用而不用管它是怎么實現(xiàn)的,從而提高協(xié)同效率。業(yè)務(wù)邏輯實現(xiàn)層繼承業(yè)務(wù)邏輯接口層,然后根據(jù)具體不同的要求來實現(xiàn)。
3.數(shù)據(jù)訪問層:
這一層用于實現(xiàn)信息系統(tǒng)對數(shù)據(jù)庫的操作,完成業(yè)務(wù)流程對數(shù)據(jù)庫中數(shù)據(jù)的插入、更新等操作。在這一層中,框架封裝了所有BLL層需要用到的數(shù)據(jù)庫操作,并將其放入DALCommon類文件,以保證數(shù)據(jù)訪問層只有單一訪問接口,減少各層之間的耦合性。
在傳統(tǒng)的數(shù)據(jù)訪問層中,一般采用輔助類,如SqlHelper通過一組靜態(tài)的重載方法來封裝數(shù)據(jù)訪問功能,開發(fā)時可以通過調(diào)用輔助類的靜態(tài)方法來對數(shù)據(jù)庫進行操作,這種方法雖然解決了部分代碼復(fù)用問題,但還是存在當需求變化時,需對一系列相關(guān)模塊進行修改的問題,而且在團隊開發(fā)中極易出現(xiàn)開發(fā)代碼重復(fù)現(xiàn)象,為了解決上述問題,在本框架的數(shù)據(jù)訪問層引入Ibatis開源框架。IBatis.net具有完全由開發(fā)者掌控Mapping規(guī)則?;赬ML配置,開發(fā)者可掌控底層,傳入?yún)?shù)支持 Hashtable、EntityObje,Dictionary等.可將離散參數(shù)封裝為單一參數(shù)傳入等優(yōu)點;這樣當需求變化時,只需修改相應(yīng)Xml文件中的SQl語句即可,其它部分都可以不用改動,以保證接口穩(wěn)定度。
IBatis DataMapper的工作原理如圖2所述。
圖2 Ibatis實現(xiàn)原理
properties.config:數(shù)據(jù)庫配置信息(包含數(shù)據(jù)名、用戶名、密碼、地址)
proivders.config數(shù)據(jù)庫驅(qū)動(包含.Net所有的數(shù)據(jù)庫驅(qū)動)
Maps文件夾:包含整個數(shù)據(jù)庫各表和各模型的關(guān)系.(主要是包含SQL語句)
Model文件夾:包含各個表的模型
在DALCommon類文件中數(shù)據(jù)訪問層通過Map ID和Hashtable對進行執(zhí)行操作,在本層中,日志記錄采用Log4net技術(shù),下面通過查詢操作來展示軟件框架代碼的具體實現(xiàn)。
public DataSet Select(Hashtable hTable,ref string errMsg,ref bool errState,ref string ActionPage,string MapID)//帶參數(shù)的查詢
最后形成的框架如圖3所示:
圖3 軟件框架結(jié)構(gòu)圖
在大型應(yīng)用軟件中一個面向?qū)ο蟮摹⒖蓮?fù)用的信息系統(tǒng)軟件框架已經(jīng)成為一個軟件開發(fā)團隊的核心物質(zhì)資本,而且更重要的是軟件框架將是一個系統(tǒng)的開發(fā)周期、開發(fā)成本及軟件維護的核心影響因子。本文所設(shè)計的框架具有以下特點:(1)在用戶界面層使用UI控制邏輯層,解決對頁面控件的煩瑣的操作,并且配合業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層的操作;(2)使用業(yè)務(wù)邏輯接口層和業(yè)務(wù)邏輯實現(xiàn)層,來實現(xiàn)項目各模塊的獨立開發(fā)和共享功能;(3)使用IBatis技術(shù)作為數(shù)據(jù)訪問層解決了項目各模塊對數(shù)據(jù)頻繁操作及維護困難的問題;(4)通過記錄每個頁面的公共變量值以實現(xiàn)應(yīng)用程序的異常管理,用戶登錄日志管理等功能。在有關(guān)學(xué)校的信息管理系統(tǒng)中得到成功應(yīng)用,實踐證明,應(yīng)用本框架省略了很多基礎(chǔ)性的工作,開發(fā)周期大大縮短,同時大大降低了各層之間耦合度和減少了軟件的冗余代碼,極大的提高了軟件生產(chǎn)率。