摘 要:近來,基于框架的軟件開發(fā)扮演著一個重要的角色。軟件框架提供了一種標(biāo)準(zhǔn)的模式在相對較短的時間內(nèi)構(gòu)建應(yīng)用程序。本文將探討一個基于.NET MEF技術(shù)的框架的設(shè)計和實(shí)現(xiàn)。為追求一個更好的框架設(shè)計,不同的設(shè)計模式也被廣泛應(yīng)用在框架中。
關(guān)鍵詞:基于框架的軟件開發(fā);軟件框架;MEF
中圖分類號:TP311.52
軟件復(fù)用一直是軟件業(yè)重要的研究領(lǐng)域,而其中軟件框架作為一種高級別軟件復(fù)用手段也在各個領(lǐng)域得到應(yīng)有和發(fā)展。相比建立通用類庫來實(shí)現(xiàn)代碼復(fù)用,軟件框架是在一個更高級別上的抽象。
基于UML軟件工程組織給出的定義??蚣埽‵ramework)是整個或部分系統(tǒng)的可重用設(shè)計,表現(xiàn)為一組抽象構(gòu)件及構(gòu)件實(shí)例間交互的方法;另一種定義認(rèn)為,框架是可被應(yīng)用開發(fā)者定制的應(yīng)用骨架。前者是從應(yīng)用方面而后者是從目的方面給出的定義。
一個框架是一個可復(fù)用的設(shè)計構(gòu)件,它規(guī)定了應(yīng)用的體系結(jié)構(gòu),闡明了整個設(shè)計、協(xié)作構(gòu)件之間的依賴關(guān)系、責(zé)任分配和控制流程,表現(xiàn)為一組抽象類以及其實(shí)例之間協(xié)作的方法,它為構(gòu)件復(fù)用提供了上下文(Context)關(guān)系。因此構(gòu)件庫的大規(guī)模重用也需要框架。
在某種程度上,將構(gòu)件和框架看成兩個不同但彼此協(xié)作的技術(shù)或許更好??蚣転闃?gòu)件提供重用的環(huán)境,為構(gòu)件處理錯誤、交換數(shù)據(jù)及激活操作提供了標(biāo)準(zhǔn)的方法。
設(shè)計一個的軟件框架,需要考慮系統(tǒng)的健壯性,擴(kuò)展性,安全性等多種因素。同時選擇合適的工具和設(shè)計模式也是非常關(guān)鍵,并且框架還需要在運(yùn)行實(shí)踐中不斷完善。所以完成一個優(yōu)秀的軟件框架是一個復(fù)雜且長期的過程。
本文將探討一種基于.NET平臺MEF(Managed Extensibility Framework)的應(yīng)用框架,的設(shè)計方法和具體實(shí)現(xiàn)。
1 MEF的基本概念
MEF(Managed Extensibility Framework)是.NET Framework 4.0的一個重要的庫。它的目標(biāo)是簡化創(chuàng)建可擴(kuò)展的應(yīng)用程序。其核心組件是ComposablePart(可組合構(gòu)件),它由ComposablePartDefintion來描述和創(chuàng)建。每一個可組合組件通過定義ExportDefintion向其它組件提供功能,通過ImportDefinition引用其它組件的功能,通過Metadata來描述組件自身的信息。在創(chuàng)建一個ComposablePart組件后,通過在組件目錄(ComposableCatalog)搜索需要的功能實(shí)現(xiàn)組件組合。
MEF組件通過使用特性來實(shí)現(xiàn)導(dǎo)入和導(dǎo)出。由于MEF的部件是以聲明方式指定其功能,因此在運(yùn)行時可發(fā)現(xiàn)這些部件。這意味著,應(yīng)用程序無需硬編碼的引用或脆弱的配置文件即可利用相關(guān)部件。通過MEF,應(yīng)用程序可以通過部件的元數(shù)據(jù)來發(fā)現(xiàn)并檢查部件,而不用實(shí)例化部件,或者甚至不用加載部件的程序集。
2 可復(fù)用框架的設(shè)計
本文所介紹的應(yīng)用軟件框架主要使用三層架構(gòu)。如圖1所示。界面表示層,業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層,各層分離有助于實(shí)現(xiàn)框架的重構(gòu)和跨平臺。比如,界面表示層從Windows窗體轉(zhuǎn)變成用Web形式展示,業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層可能只需要微小的改動甚至不需要改動就能實(shí)現(xiàn)。
2.1 界面表示層的設(shè)計
界面表示層用來提供用戶界面來訪問框架以及外部構(gòu)建的功能和服務(wù)。該層的設(shè)計主要才用MVP模式,進(jìn)一步將界面展示和后臺邏輯分離。所有純粹的界面都集中在View中,界面上用戶請求的數(shù)據(jù)則通過Presenter從Model中獲取并返回給View。另外,MVP模式還有另一種實(shí)現(xiàn)形式,除了Model,View和Presenter還加入一個Controller以便將不同界面的交互通信都集中到Controller中來實(shí)現(xiàn)。采用MVP模式將界面和后臺邏輯分離,可以撇開界面,以最小的代價實(shí)現(xiàn)對界面后臺邏輯的單元測試。
界面表示層包含兩類界面(View)。一類界面是對框架本身的界面,如登錄界面,主界面,用戶及權(quán)限管理和配置管理等;另一類界面是構(gòu)建容器界面,主要用來加載外部構(gòu)件,擴(kuò)展系統(tǒng)功能。
2.2 業(yè)務(wù)邏輯層的設(shè)計
業(yè)務(wù)邏輯層主要包含框架了具體邏輯的實(shí)現(xiàn),包括外部構(gòu)件管理、用戶管理、身份認(rèn)證管理和配置管理。
(1)核心模塊是外部構(gòu)件管理模塊,它主要負(fù)責(zé)外部構(gòu)件的動態(tài)加載和卸載。該模塊主要基于.NET Framework中的MEF技術(shù)來實(shí)現(xiàn)。它主要有兩部分組成。一部分是外部構(gòu)件的導(dǎo)入導(dǎo)出管理,其主要負(fù)責(zé)創(chuàng)建MEF的組件目錄和組合容器等。另一部分是面向外部構(gòu)件的接口,即定義外部構(gòu)件所要遵守的契約以及框架提供給構(gòu)件的服務(wù)的接口。
外部構(gòu)件管理模塊使用成熟的MEF來管理外部控件,相比從零開發(fā)可以減少代碼開發(fā)和功能測試的精力,縮短框架的開發(fā)周期。它作為核心模塊,對外提供了功能擴(kuò)展點(diǎn)?;诳蚣荛_發(fā)的應(yīng)用只需關(guān)注于MEF構(gòu)件的開發(fā),通過插拔構(gòu)件動態(tài)的配置應(yīng)用程序所需的功能。
(2)用戶管理模塊,主要負(fù)責(zé)用戶以及相應(yīng)權(quán)限的管理。該模塊的設(shè)計主要是考慮用戶和組以及組的權(quán)限都是可配置的,需要通過數(shù)據(jù)訪問層來實(shí)現(xiàn)配置的持久化。用戶的認(rèn)證(或者叫登錄管理)的設(shè)計則需要考慮到將來對用戶登錄方式的擴(kuò)展,這里需要用到設(shè)計模式中的策略模式(Strategy)來實(shí)現(xiàn)。這種需要定義一個抽象類并包含一個或多個抽象方法,然后不同的算法來具體實(shí)現(xiàn)抽象類定義的抽象方法。當(dāng)有新的算法加入,只需要新增子類,而不需要修改現(xiàn)有類。如圖2所示。
2.3 數(shù)據(jù)訪問層的設(shè)計
數(shù)據(jù)訪問層主要負(fù)責(zé)對數(shù)據(jù)源和外部服務(wù)的訪問。數(shù)據(jù)訪問層的設(shè)計主要要注意以下四個職責(zé):
(1)數(shù)據(jù)訪問層應(yīng)該提供基本的持久化操作CRUD的操作。
(2)提供能夠滿足類中信息的讀取操作。
(3)數(shù)據(jù)庫訪問必須提供事務(wù)的管理,特別是批量持久化的過程中,事務(wù)不但能夠減少與數(shù)據(jù)庫操作的次數(shù),而且根據(jù)事務(wù)的四個特性可以提供更好的安全性。
(4)數(shù)據(jù)訪問層必須提供處理并發(fā)的功能。
應(yīng)用框架的數(shù)據(jù)訪問層需要做到獨(dú)立于具體數(shù)據(jù)源(包括數(shù)據(jù)庫和文件等),即實(shí)現(xiàn)低耦合度。這就需要使用面向接口編程,將對數(shù)據(jù)庫的CRUD的方法都定義到接口上,利用工廠方法模式動態(tài)的根據(jù)配置創(chuàng)建所需要的數(shù)據(jù)庫實(shí)現(xiàn)。如圖3所示。另外創(chuàng)建具體的數(shù)據(jù)庫操作的實(shí)例可以選擇兩種方式:1)工廠類根據(jù)讀取的配置利用反射技術(shù)來創(chuàng)建對應(yīng)的實(shí)例。2)利用控制反轉(zhuǎn)(IoC,Inversion of Control)工具來創(chuàng)建出實(shí)例,如Unity。
2.4 交叉層的設(shè)計
在三層架構(gòu)的設(shè)計中都會有一些獨(dú)立的組件會被三層所調(diào)用如日志組件、異常處理、實(shí)例類庫、全球化和本地化的組件等。這些組件一般都會放在交叉層(Cross cutting)。這些組件比較通用的,往往是可以使用一些開源的組件,比如日志和異常處理等可以直接復(fù)用微軟提供的企業(yè)庫(Enterprise Library),或根據(jù)自己的需要修改。
3 結(jié)束語
框架的本質(zhì)在于提供一個可復(fù)用的軟件平臺,同時提供必要的擴(kuò)展點(diǎn)來支持功能構(gòu)件的插拔。而基于框架的應(yīng)用程序的開發(fā),則只需要專注于外部構(gòu)件的實(shí)現(xiàn)。通過這樣方法,可以最大限度的復(fù)用框架提供的功能,縮短開發(fā)周期和開發(fā)成本。
在框架的實(shí)際開發(fā)過程中,還會遇到各種問題。比如如何有效隔離框架和外部構(gòu)件,在構(gòu)件產(chǎn)生異常是,框架本身能正常運(yùn)行;如何快速部署框架或者基于框架應(yīng)用程序等。應(yīng)用領(lǐng)域不同也會很大程度上對框架的設(shè)計和實(shí)現(xiàn)產(chǎn)生影響??傊?,一個好的框架是領(lǐng)域經(jīng)驗(yàn)和設(shè)計經(jīng)驗(yàn)的反復(fù)迭代過程。
參考文獻(xiàn):
[1]李礁,李敏.基于工廠模式的易復(fù)用數(shù)據(jù)訪問層設(shè)計[J].軟件導(dǎo)刊,2011(03).
[2]王孝明,胡健,陸坤,周偉.基于.NET平臺可復(fù)用軟件框架的設(shè)計與實(shí)現(xiàn)[J].計算機(jī)工程,2004(22).
[3]吳毅堅,趙文耘.特定領(lǐng)域軟件框架的提取方法研究[J].電子學(xué)報,2003(S1):2151-2153.
[4]文俊浩,徐傳運(yùn),于楊,徐玲.基于廣義軟件框架的開發(fā)過程研究[J].計算機(jī)應(yīng)用研究,2006(05).
[5]劉瑜,張世琨,王立福,楊芙清.基于構(gòu)件的軟件框架與角色擴(kuò)展形態(tài)研究[J].軟件學(xué)報,2003(08).
[6]王曉燕,劉淑芬,張俊.一種基于領(lǐng)域模型和構(gòu)件組合的軟件開發(fā)框架[J].電子學(xué)報,2009(03).
[7]王世安.基于敏捷開發(fā)的構(gòu)件化軟件可靠性研究[J].微電子學(xué)與計算機(jī),2011(03).
[8]向俊蓮,楊杰,梅宏.基于軟件體系結(jié)構(gòu)的構(gòu)件組裝工具ABC-Tool[J].計算機(jī)研究與發(fā)展,2004(06).
[9]柴晟,李明富,羅莉娟,劉旗超.基于設(shè)計模式構(gòu)建數(shù)據(jù)訪問中間件[J].計算機(jī)工程與設(shè)計,2007(17).
[10]王玲,夏榆濱.基于構(gòu)件視圖的組裝技術(shù)[J].計算機(jī)應(yīng)用,2009(12).
[11]胡文蕙,王立福,張世坤.軟件框架研究與實(shí)踐[C].2001全國軟件技術(shù)研討會,2001.
[12]胡霞.基于構(gòu)件的可復(fù)用軟件框架的研究與設(shè)計[J].電腦編程技巧與維護(hù),2009(24).
[13]Stefano De Panfilis, Arne J. Berre. Open issues and concerns on Component Based Software Engineering [S.1.]. Deliverable of results of CBSEnet IST-2001-35485,2005.
[14]Nasib S. Gill. Reusability issues in component-based development[S.1.],ACM SIGSOFT Software Engineering Notes,v.28 n.4,July 2003.
作者簡介:蔡君(1983-),男,畢業(yè)于南京工業(yè)大學(xué),學(xué)士學(xué)位,現(xiàn)主攻軟件工程碩士學(xué)位,高級工程師,研究方向:軟件工程;胡偉(1988-),男,畢業(yè)于蘇州大學(xué),學(xué)士學(xué)位,現(xiàn)主攻軟件工程碩士學(xué)位,工程師,研究方向:軟件工程。
作者單位:蘇州大學(xué) 計算機(jī)科學(xué)與技術(shù)學(xué)院,江蘇蘇州 215006