李璟
摘要摘要:在軟件設(shè)計(jì)過程中,設(shè)計(jì)模式是面向?qū)ο筌浖到y(tǒng)的可重用、可靠、巧妙、通用的設(shè)計(jì)解決方案,可以幫助設(shè)計(jì)者更快更好地完成軟件系統(tǒng)設(shè)計(jì)。設(shè)計(jì)模式中的抽象工廠模式為軟件系統(tǒng)結(jié)構(gòu)提供了靈活而強(qiáng)大的動(dòng)態(tài)擴(kuò)展機(jī)制,基于.NET反射技術(shù)的抽象工廠模式可以簡化工廠代碼復(fù)雜度,被稱為.NET反射工廠。介紹了基于.NET反射工廠的Web應(yīng)用系統(tǒng)分層架構(gòu),分析了架構(gòu)各層次功能,并以Web應(yīng)用開發(fā)中常用的用戶登錄功能為例,說明了其數(shù)據(jù)訪問層抽象工廠模式的具體實(shí)現(xiàn)方法。實(shí)驗(yàn)證明,在Web開發(fā)中使用.NET分層架構(gòu)和.NET反射工廠實(shí)現(xiàn)軟件重用,具有低耦合度、高可靠性、高可維護(hù)性及高擴(kuò)展性的優(yōu)點(diǎn),值得推廣應(yīng)用。
關(guān)鍵詞關(guān)鍵詞:.NET分層架構(gòu);.NET反射工廠;抽象工廠模式;Web開發(fā)
DOIDOI:10.11907/rjdk.1431028
中圖分類號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào)
文章編號(hào):16727800(2015)004010503
0引言
隨著整個(gè)IT產(chǎn)業(yè)的飛速發(fā)展,軟件行業(yè)逐步走出作坊式的生產(chǎn)模式,向著工程化方向邁進(jìn),軟件設(shè)計(jì)者也愈發(fā)注重構(gòu)建具有低耦合度、高可靠性、高可維護(hù)性及高可擴(kuò)展性的軟件系統(tǒng)。設(shè)計(jì)模式是近20年來在軟件工程領(lǐng)域取得的重大成就,使得軟件開發(fā)人員可以更輕松快捷地重用成功的軟件設(shè)計(jì),大大提高了軟件設(shè)計(jì)的效率和質(zhì)量。自從20世紀(jì)90年代GOF四人組的《設(shè)計(jì)模式》出版以來,設(shè)計(jì)模式一直是國內(nèi)外軟件工程領(lǐng)域的研究熱點(diǎn)。設(shè)計(jì)模式中的抽象工廠模式為軟件系統(tǒng)結(jié)構(gòu)提供了非常靈活而強(qiáng)大的動(dòng)態(tài)擴(kuò)展機(jī)制,采用.NET反射技術(shù)的抽象工廠模式可以簡化工廠代碼的復(fù)雜程度[12]。本文探討了基于.NET反射技術(shù)的Web開發(fā)中使用抽象工廠模式實(shí)現(xiàn)最大化軟件復(fù)用的架構(gòu)及優(yōu)越性,并實(shí)例展示了其具體實(shí)現(xiàn)方法,具有實(shí)際應(yīng)用意義和參考價(jià)值。
1抽象工廠模式及.NET反射技術(shù)
1.1工廠模式與抽象工廠模式
軟件行業(yè)最經(jīng)典的設(shè)計(jì)模式著作是GOF所著的《設(shè)計(jì)模式——可復(fù)用面向?qū)ο筌浖A(chǔ)》一書,該書共提出了23種設(shè)計(jì)模式,并將這些模式分為創(chuàng)建型、結(jié)構(gòu)型和行為型三大類[3]。工廠模式是軟件設(shè)計(jì)中最常用的一種創(chuàng)建型設(shè)計(jì)模式,它為創(chuàng)建一系列相關(guān)對象提供了統(tǒng)一接口或接口集,從而隱藏了具體產(chǎn)品類(具體產(chǎn)品類指要實(shí)例化的具體類)實(shí)例化過程的復(fù)雜性和多變性。使用工廠模式,調(diào)用者只關(guān)心產(chǎn)品的接口無需關(guān)心其具體實(shí)現(xiàn)。工廠模式根據(jù)抽象程度的不同可分為3種:簡單工廠模式、工廠方法模式、抽象工廠模式。簡單工廠模式?jīng)]有工廠接口,算不上真正意義上的工廠模式。工廠方法模式提供的所有產(chǎn)品都衍生自同一個(gè)接口,而抽象工廠模式所提供的產(chǎn)品則衍生自不同的接口。3種工廠模式中,抽象工廠模式最復(fù)雜,也最能體現(xiàn)工廠模式的優(yōu)點(diǎn)。抽象工廠模式包含抽象工廠、具體工廠、抽象產(chǎn)品和具體產(chǎn)品共4個(gè)部分。其中,抽象工廠為創(chuàng)建對象提供了一般接口;具體工廠為抽象工廠的具體實(shí)現(xiàn);抽象產(chǎn)品定義了被創(chuàng)建對象的一般接口;具體產(chǎn)品為抽象產(chǎn)品的具體實(shí)現(xiàn)。
1.2.NET反射技術(shù)與反射工廠
工廠模式中,具體工廠類的區(qū)別僅僅在于返回實(shí)例的類型不同[4],若要?jiǎng)討B(tài)地決定需要?jiǎng)?chuàng)建的具體產(chǎn)品,就可以省略具體工廠類,并提高軟件系統(tǒng)的可重用性和可擴(kuò)展性。.NET反射技術(shù)可以完成上述功能。
反射是.NET中的重要機(jī)制。反射是動(dòng)態(tài)識(shí)別類型信息的能力,它幫助程序設(shè)計(jì)人員利用一些在程序運(yùn)行時(shí)動(dòng)態(tài)綁定的信息(這些信息在設(shè)計(jì)時(shí)是未知的)去動(dòng)態(tài)地使用某些類型信息。利用.NET反射技術(shù),可以通過將具體產(chǎn)品類名傳遞給抽象工廠的方法,即通過后期動(dòng)態(tài)綁定需要?jiǎng)?chuàng)建的具體產(chǎn)品類的方法,省略了具體工廠類,這樣得到的簡化的工廠被稱為反射工廠。使用反射工廠的優(yōu)點(diǎn)是省略了工廠模式中的具體工廠類,降低了代碼的冗余度,提高了軟件系統(tǒng)的可重用性和可擴(kuò)展性。如前所述,.NET反射工廠只包含抽象工廠、抽象產(chǎn)品和具體產(chǎn)品3部分。
2基于.NET反射工廠的Web應(yīng)用系統(tǒng)分層架構(gòu)
在傳統(tǒng)軟件設(shè)計(jì)中,通常將所有程序代碼都混合在一起,造成可讀性差、耦合度高的缺點(diǎn),對日后系統(tǒng)的維護(hù)和擴(kuò)展造成極大困難。為了盡量克服以上弊端,系統(tǒng)分層架構(gòu)思想應(yīng)運(yùn)而生,即將系統(tǒng)的各個(gè)功能(如數(shù)據(jù)庫訪問、業(yè)務(wù)邏輯、用戶界面等)分層,各層之間通過協(xié)作來實(shí)現(xiàn)整體功能。分層架構(gòu)的提出,是軟件開發(fā)思想的一個(gè)重大進(jìn)步,在很大程度上解決了傳統(tǒng)軟件開發(fā)中普遍存在的可讀性差、耦合度高和可維護(hù)性低的問題。目前,典型的分層架構(gòu)是三層架構(gòu),即自底向上依次是數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層和表示層,這種典型的分層架構(gòu)經(jīng)實(shí)踐驗(yàn)證是一種合理有效的分層設(shè)計(jì)。
在實(shí)際的基于.NET的Web開發(fā)項(xiàng)目中,通常在反射工廠的思想指導(dǎo)下將上述分層架構(gòu)由原有的三層擴(kuò)展為七層,分別為表示層(WebUI)、業(yè)務(wù)邏輯層(BLL)、業(yè)務(wù)實(shí)體層(MODEL)、數(shù)據(jù)訪問抽象工廠層(DALFactory)、數(shù)據(jù)訪問接口定義層(IDAL)、數(shù)據(jù)訪問層(DAL)、數(shù)據(jù)訪問幫助組件層(DBHelper)。這樣每個(gè)層次完成的功能比較單一,程序代碼有規(guī)律可循,系統(tǒng)分層架構(gòu)更加清晰,使得開發(fā)人員可以將更多的精力放到業(yè)務(wù)邏輯的設(shè)計(jì)上。基于.NET反射工廠的Web應(yīng)用系統(tǒng)分層架構(gòu)如圖1所示。
3分層架構(gòu)中各層次功能與實(shí)現(xiàn)
3.1表示層
表示層(WebUI)主要是Web系統(tǒng)的UI部分,負(fù)責(zé)用戶與系統(tǒng)之間交互過程中數(shù)據(jù)的輸入驗(yàn)證、輸出呈現(xiàn)以及頁面狀態(tài)管理等。
3.2業(yè)務(wù)邏輯層
業(yè)務(wù)邏輯層(BLL)是整個(gè)系統(tǒng)的核心,它與系統(tǒng)的具體業(yè)務(wù)及領(lǐng)域有關(guān)。業(yè)務(wù)邏輯層負(fù)責(zé)按照業(yè)務(wù)邏輯將表示層提交的數(shù)據(jù)進(jìn)行提取、過濾和處理。
3.3業(yè)務(wù)實(shí)體層
業(yè)務(wù)實(shí)體層(MODEL)中的實(shí)體類是業(yè)務(wù)中客觀存在的對象數(shù)據(jù)結(jié)構(gòu)的封裝,用于映射數(shù)據(jù)庫的數(shù)據(jù)表或視圖,實(shí)體類是單純數(shù)據(jù)庫表的封裝,通常只包括私有變量及對應(yīng)屬性。實(shí)體類的作用主要有兩個(gè):一是將數(shù)據(jù)和實(shí)際存儲(chǔ)區(qū)域即數(shù)據(jù)庫表隔離,保證了業(yè)務(wù)的獨(dú)立性,提高了可重用性;二是便于在各層之間傳遞數(shù)據(jù)。實(shí)體層中每一實(shí)體類的每一屬性都對應(yīng)某一個(gè)數(shù)據(jù)庫表的每一字段,通過實(shí)體類參數(shù)可以輕松在各層之間傳遞數(shù)據(jù)表數(shù)據(jù),當(dāng)要修改這種參數(shù)時(shí),不需修改相應(yīng)的調(diào)用接口,這樣提高了可維護(hù)性。
3.4數(shù)據(jù)訪問抽象工廠層
數(shù)據(jù)訪問抽象工廠層(DALFactory)的作用在于提高數(shù)據(jù)庫的可移植性[5]。當(dāng)應(yīng)用系統(tǒng)需要在多個(gè)異構(gòu)數(shù)據(jù)庫之間遷移時(shí),可以采用利用抽象工廠模式動(dòng)態(tài)綁定具體數(shù)據(jù)庫的方法,這種方法幾乎不需要修改數(shù)據(jù)層代碼即可完成異構(gòu)數(shù)據(jù)庫的遷移。如圖1所示,具體實(shí)現(xiàn)步驟是:首先,在數(shù)據(jù)訪問接口定義層(IDAL)定義數(shù)據(jù)訪問的統(tǒng)一接口集;然后,在數(shù)據(jù)訪問層(DAL)定義實(shí)現(xiàn)IDAL接口的訪問具體數(shù)據(jù)庫的數(shù)據(jù)訪問類,如訪問SQL Server數(shù)據(jù)庫的SQLServerDAL、訪問Access數(shù)據(jù)庫的AccessDAL;再在數(shù)據(jù)訪問抽象工廠層(DALFactory)實(shí)現(xiàn).NET反射工廠,創(chuàng)建和管理實(shí)現(xiàn)IDAL接口的DAL對象。數(shù)據(jù)訪問抽象工廠層利用.NET反射技術(shù),根據(jù)在Web.config配置文件中獲取的設(shè)置某種具體數(shù)據(jù)庫的屬性值,動(dòng)態(tài)創(chuàng)建并返回該具體數(shù)據(jù)庫的DAL對象。在實(shí)際應(yīng)用中,只需改變Web.config配置文件中的某個(gè)屬性值即可完成數(shù)據(jù)庫的移植。
3.5數(shù)據(jù)訪問接口定義層
數(shù)據(jù)訪問接口定義層(IDAL)抽象出數(shù)據(jù)訪問邏輯的接口集,脫離對具體數(shù)據(jù)庫的依賴,為數(shù)據(jù)訪問層提供統(tǒng)一的數(shù)據(jù)訪問接口,有利于數(shù)據(jù)庫移植。
3.6數(shù)據(jù)訪問層
數(shù)據(jù)訪問層(DAL)的職責(zé)是與數(shù)據(jù)源進(jìn)行交互,負(fù)責(zé)對某種具體數(shù)據(jù)庫的訪問和操作,實(shí)現(xiàn)數(shù)據(jù)訪問接口層中定義的數(shù)據(jù)訪問接口。該層不包含任何業(yè)務(wù)邏輯,而只關(guān)注于數(shù)據(jù)的訪問和操作。
3.7數(shù)據(jù)訪問幫助組件層
數(shù)據(jù)訪問幫助組件層(DBHelper)實(shí)現(xiàn)有關(guān)訪問和操作某種具體數(shù)據(jù)庫的通用方法的類,供在數(shù)據(jù)訪問層中訪問和操作某種具體數(shù)據(jù)庫時(shí)使用。如SQLServerDAL使用SQLServerDBHelper類、AccessDAL使用AccessDBHelper類。
4數(shù)據(jù)訪問層抽象工廠模式具體實(shí)現(xiàn)
以Web應(yīng)用開發(fā)中常用的用戶登錄功能為例,說明基于.NET反射工廠的Web應(yīng)用系統(tǒng)中數(shù)據(jù)訪問層抽象工廠模式的具體實(shí)現(xiàn)方法。
4.1Web.Config配置文件設(shè)置
在Web項(xiàng)目的Web.Config文件中的
系統(tǒng)在運(yùn)行時(shí),根據(jù)Web項(xiàng)目的Web.Config配置文件中的
5結(jié)語
采用分層架構(gòu)開發(fā)Web應(yīng)用系統(tǒng),降低了系統(tǒng)的耦合性,可適應(yīng)不斷變化的業(yè)務(wù)需求,能有效降低設(shè)計(jì)和維護(hù)成本。在數(shù)據(jù)訪問層采用.NET反射工廠技術(shù)可以方便地訪問和遷移異構(gòu)數(shù)據(jù)庫,很好地實(shí)現(xiàn)了軟件重用。
參考文獻(xiàn)參考文獻(xiàn):
[1]甄鐳..NET與設(shè)計(jì)模式[M].北京:電子出版社,2005.
[2]GOF.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].北京:機(jī)械工業(yè)出版社,2000.
[3]李鵬.基于.NET反射機(jī)制和組件復(fù)用的中小型離散制造企業(yè)MES配置系統(tǒng)研究[J].軟件導(dǎo)刊,2012,11(8):9193.
[4]劉軍華.工廠設(shè)計(jì)模式在WEB教育資源管理系統(tǒng)中的應(yīng)用[J].長沙通信職業(yè)技術(shù)學(xué)院學(xué)報(bào),2010,9(4):3135.
[5]薛曉萍.基于.NET平臺(tái)的分層架構(gòu)與設(shè)計(jì)模式應(yīng)用研究[J].惠州學(xué)院學(xué)報(bào):自然科學(xué)版,2011(6):4043.
[6]JAMES W COOPER.C#設(shè)計(jì)模式[M].北京:電子工業(yè)出版社,2003.
[7]劉潤東.UML對象設(shè)計(jì)與編程[M].北京:北京希望電子出版社,2001.
責(zé)任編輯(責(zé)任編輯:孫娟)