本發(fā)明涉及信息技術(shù)領(lǐng)域,特別涉及組件式開(kāi)發(fā)模式,以及系統(tǒng)的依賴(lài)注入方式,同時(shí)涉及到松耦合的組件之間的參數(shù)傳遞方式。具體地說(shuō)是一種基于組件式開(kāi)發(fā)模式松耦合的子功能模塊間參數(shù)傳遞方法。
背景技術(shù):
隨著信息技術(shù)的不斷發(fā)展,企業(yè)的各種信息管理系統(tǒng)也越來(lái)越復(fù)雜龐大,單一的工程模塊再也無(wú)法滿(mǎn)足日漸復(fù)雜的業(yè)務(wù)需求,為了簡(jiǎn)化系統(tǒng)的開(kāi)發(fā),以及使系統(tǒng)結(jié)構(gòu)更加清晰,便于系統(tǒng)的部署與后期維護(hù),我們將整個(gè)系統(tǒng)劃分為不同的子功能模塊,每個(gè)子功能模塊以獨(dú)立組件的方式進(jìn)行設(shè)計(jì)、開(kāi)發(fā)、測(cè)試,最后將各個(gè)組件按需動(dòng)態(tài)集成到系統(tǒng)主框架中。
基于以上所訴的開(kāi)發(fā)模式及系統(tǒng)集成方式,要求系統(tǒng)各個(gè)子功能模塊相互獨(dú)立,當(dāng)某個(gè)功能模塊出現(xiàn)異?;蛉鄙倌硞€(gè)功能模塊時(shí),其他功能模塊能夠正常運(yùn)行,各個(gè)功能模塊能夠獨(dú)立運(yùn)行,互不影響。但是實(shí)際項(xiàng)目中并不是每個(gè)功能模塊都是絕對(duì)獨(dú)立的,不同的業(yè)務(wù)功能之間存在著千絲萬(wàn)縷的關(guān)系,因此各子功能模塊之間也存在參數(shù)傳遞的需求。那么不同組件之間在保證參數(shù)正常傳遞的基礎(chǔ)上如何實(shí)現(xiàn)組件間的松散耦合,成為同一系統(tǒng)框架下不同子模塊間參數(shù)傳遞的一個(gè)主要課題。
因此在基于組件式開(kāi)發(fā)模式下的實(shí)現(xiàn)子模塊間的參數(shù)傳遞的同時(shí),保證各個(gè)子模塊的松散耦合成為系統(tǒng)各獨(dú)立模塊交互的關(guān)鍵,而該發(fā)明方法比較完美的解決了子模塊間即相互關(guān)聯(lián)又彼此獨(dú)立這一看似矛盾的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明是基于同一系統(tǒng)主框架下的不同功能組件之間的參數(shù)傳遞方法,所有的子功能模塊注入到同一系統(tǒng)主框架,同時(shí)各子功能模塊又是獨(dú)立的功能組件,每一個(gè)功能組件可獨(dú)立設(shè)計(jì)、開(kāi)發(fā)、測(cè)試、運(yùn)行,彼此相互獨(dú)立。
本發(fā)明采用的技術(shù)方案如下:一種基于組件式開(kāi)發(fā)模式松耦合的子模塊間 參數(shù)傳遞方法,多個(gè)子模塊通過(guò)Prism提供的依賴(lài)注入方式集成到采用Prism技術(shù)開(kāi)發(fā)的系統(tǒng)主框架中,系統(tǒng)主框架提供系統(tǒng)總線用于承載參數(shù)信息,各個(gè)子模塊向系統(tǒng)總線發(fā)送和接收參數(shù)信息,包括以下步驟:
系統(tǒng)的任意子模塊對(duì)參數(shù)信息進(jìn)行封裝處理并向系統(tǒng)總線發(fā)布;
有參數(shù)需求的子模塊向系統(tǒng)總線訂閱參數(shù)信息,在接收到總線上傳輸?shù)膮?shù)信息之后,進(jìn)行拆封和判斷操作,最終對(duì)參數(shù)信息進(jìn)行處理。
所述封裝處理并向系統(tǒng)總線發(fā)布包括以下步驟:
首先進(jìn)行參數(shù)封裝:依據(jù)定義的消息類(lèi)對(duì)參數(shù)信息進(jìn)行封裝,消息頭包括消息類(lèi)型、發(fā)送頁(yè)面名稱(chēng);消息體包括參數(shù)信息的內(nèi)容;
然后進(jìn)行消息信息序列化:通過(guò)xml序列化函數(shù)將封裝后的參數(shù)信息即消息實(shí)體序列化為字符串信息;
最后進(jìn)行消息的發(fā)布:通過(guò)Prism提供的類(lèi)庫(kù)在總線上發(fā)布字符串信息。
所述有參數(shù)需求的子模塊向系統(tǒng)總線訂閱參數(shù)信息包括以下步驟:
首先進(jìn)行消息頭信息的注冊(cè):有參數(shù)需求的子模塊將字符串信息的消息頭信息注冊(cè)到接收頁(yè)面的初始化列表中,即消息類(lèi)型及發(fā)送頁(yè)面的注冊(cè);
然后進(jìn)行消息訂閱:通過(guò)Prism提供的類(lèi)庫(kù)在系統(tǒng)總線上訂閱字符串信息。
所述進(jìn)行拆封和判斷操作,最終對(duì)參數(shù)信息進(jìn)行處理包括以下步驟:
對(duì)字符串信息進(jìn)行接收與拆封:
子模塊接收系統(tǒng)總線發(fā)送的字符串信息,應(yīng)用xml反序列化函數(shù)將字符串信息拆封,獲取消息頭,根據(jù)消息類(lèi)型及發(fā)送頁(yè)面名稱(chēng)與初始化列表中注冊(cè)的消息類(lèi)型及發(fā)送頁(yè)面名稱(chēng)進(jìn)行對(duì)比來(lái)判斷是否對(duì)接收的字符串信息進(jìn)行處理;對(duì)于要處理的消息將消息體傳送到參數(shù)處理函數(shù)對(duì)參數(shù)進(jìn)行處理;否則,不予處理;
對(duì)消息體進(jìn)行參數(shù)處理:參數(shù)處理函數(shù)接收要處理的消息體,通過(guò)xml提供的反序列化函數(shù)將消息體拆封,獲取拆封后的參數(shù)信息,之后根據(jù)業(yè)務(wù)需求對(duì)參數(shù)進(jìn)行操作。
所述子模塊為發(fā)送者或者接收者。
所述子模塊采用用戶(hù)組件的開(kāi)發(fā)模式,為獨(dú)立的功能組件,動(dòng)態(tài)將頁(yè)面注入到系統(tǒng)主框架。
本發(fā)明具有以下優(yōu)點(diǎn)及有益效果:
1.實(shí)現(xiàn)了子功能模塊之間的參數(shù)傳遞功能,使每個(gè)子功能模塊不是信息孤島,彼此之間可以相互交互。
2.該方法在實(shí)現(xiàn)子模塊之間參數(shù)傳遞的基礎(chǔ)上,實(shí)現(xiàn)了模塊之間的松散耦合。各個(gè)子功能模塊在相互獨(dú)立的基礎(chǔ)上又有信息交互,同時(shí)不會(huì)使一個(gè)模塊的異?,F(xiàn)象擴(kuò)散到其他模塊,保證了系統(tǒng)的穩(wěn)定性。
3.該方法充分利用了Prism提供的訂閱與發(fā)布機(jī)制,充分利用了系統(tǒng)總線機(jī)制,將參數(shù)信息廣播到系統(tǒng)總線上,各個(gè)接收頁(yè)面按需接收和處理參數(shù)信息。較大程度減少了不同模塊開(kāi)發(fā)人員之間的交互,降低系統(tǒng)的開(kāi)發(fā)難度,提高系統(tǒng)開(kāi)發(fā)效率。
4.該方法為模塊的動(dòng)態(tài)集成打下了良好的基礎(chǔ),模塊間能夠自由傳遞參數(shù)的同時(shí),也相互獨(dú)立,子功能模塊的動(dòng)態(tài)集成與卸載不會(huì)對(duì)其他模塊造成任何影響,提高了系統(tǒng)的靈活性。
5.本發(fā)明使得系統(tǒng)各個(gè)子模塊充分解耦,其中某一模塊發(fā)生異常時(shí),不會(huì)影響到其他模塊的正常運(yùn)行,從而最大程度的保證了系統(tǒng)的穩(wěn)定性。
附圖說(shuō)明
圖1為本發(fā)明的基于組件式開(kāi)發(fā)模式子模塊交互集成方式圖;
圖2為子功能模塊間參數(shù)傳遞方式圖。
具體實(shí)施方式
下面結(jié)合附圖1、2詳細(xì)介紹本方法的具體實(shí)施方式。
隨著信息技術(shù)的不斷提高,系統(tǒng)也越來(lái)越復(fù)雜,為了系統(tǒng)開(kāi)發(fā)與后期維護(hù)等的方便,依據(jù)軟件工程的方法,將企業(yè)信息管理系統(tǒng)架構(gòu)劃分為多個(gè)相對(duì)獨(dú)立的功能模塊,在程序開(kāi)發(fā)和集成過(guò)程中盡量確保各個(gè)子功能模塊之間松散耦 合。在確保子功能模塊相對(duì)獨(dú)立的同時(shí),也要保證模塊間正常的業(yè)務(wù)交互,實(shí)現(xiàn)不同模塊頁(yè)面間的參數(shù)傳遞功能,該方法的必要條件:
1、根據(jù)業(yè)務(wù)需求將整個(gè)系統(tǒng)劃分為多個(gè)獨(dú)立的功能模塊;
2、整個(gè)系統(tǒng)采用組件式開(kāi)發(fā)模式,每一個(gè)子功能模塊都是一個(gè)獨(dú)立的功能組件,并且每個(gè)功能組件都符合Prism的組件式開(kāi)發(fā)模式;
3、各功能組件采用依賴(lài)注入的方式集成到系統(tǒng)主框架;
4、在整個(gè)系統(tǒng)中,每一個(gè)功能模塊即可以作為參數(shù)發(fā)送方,也可以作為參數(shù)接收方;
5、每個(gè)頁(yè)面必須清楚接收來(lái)自于哪些頁(yè)面的參數(shù),以及參數(shù)的類(lèi)型。
首先,各子功能模塊集成在同一系統(tǒng)主框架中,并且以獨(dú)立工程的方式設(shè)計(jì)、開(kāi)發(fā)、調(diào)試、各子模塊以系統(tǒng)主框架為載體可以獨(dú)立運(yùn)行。其次,各子功能模塊基于用戶(hù)組件模式的開(kāi)發(fā)方式,可動(dòng)態(tài)集成到系統(tǒng)主框架中。最后,整個(gè)系統(tǒng)既要實(shí)現(xiàn)子模塊的按需動(dòng)態(tài)插拔功能,也要實(shí)現(xiàn)模塊間的數(shù)據(jù)通信,在子模塊之間互不影響互不制約的同時(shí)也存在著業(yè)務(wù)信息的交互,即實(shí)現(xiàn)一種松耦合的模塊間參數(shù)傳遞方法。
整個(gè)系統(tǒng)框架采用Prism注入式集成方式,根據(jù)業(yè)務(wù)需求可動(dòng)態(tài)將子功能模塊注入到系統(tǒng)中,實(shí)現(xiàn)子功能模塊熱插拔的動(dòng)態(tài)集成方式。
每個(gè)子功能模塊都采用用戶(hù)組件的開(kāi)發(fā)模式,每個(gè)子功能模塊的開(kāi)發(fā)需要符合Prism組件式開(kāi)發(fā)模式的規(guī)范,能夠按需動(dòng)態(tài)將相關(guān)頁(yè)面注入到系統(tǒng)主框架。子功能模塊從設(shè)計(jì)到運(yùn)行都可獨(dú)立完成,可采用分布式同步開(kāi)發(fā)測(cè)試。每個(gè)子功能模塊即可以是發(fā)送者也可以是接收者,可根據(jù)實(shí)際需求來(lái)轉(zhuǎn)換角色,并且發(fā)送模塊與接收模塊沒(méi)有必然的聯(lián)系,不會(huì)相互影響與制約,可單獨(dú)運(yùn)行。
整個(gè)系統(tǒng)以依賴(lài)注入的方式來(lái)集成各個(gè)子功能模塊,每一個(gè)子功能模塊都是一個(gè)獨(dú)立的控件庫(kù),可以根據(jù)需求動(dòng)態(tài)組合不同的子功能模塊,形成不同功能的系統(tǒng),各子功能模塊之間松散耦合,相互獨(dú)立。
各個(gè)子功能模塊既可以是發(fā)送者也可以是接收者,發(fā)送子模塊將參數(shù)封裝 成固定的消息格式,序列化后以廣播的方式向系統(tǒng)總線發(fā)布,而接收子模塊根據(jù)需要向系統(tǒng)總線訂閱消息信息。
接收子模塊初始化接收消息頭信息列表,并接收系統(tǒng)總線上的消息信息,拆封消息,獲取消息頭和消息體,依據(jù)消息頭及初始化的消息頭信息列表,判斷是否處理消息體,對(duì)于符合要求的消息處理其消息體信息(參數(shù)信息)。
首先系統(tǒng)各子功能模塊按照Prism組件式開(kāi)發(fā)模式進(jìn)行設(shè)計(jì)、開(kāi)發(fā),并完成單獨(dú)的測(cè)試工作。之后按照實(shí)際需求將子功能模塊對(duì)應(yīng)的功能組件注入到系統(tǒng)主框架,實(shí)現(xiàn)功能組件的按需動(dòng)態(tài)集成的特性,對(duì)于存在業(yè)務(wù)關(guān)聯(lián)的模塊之間存在參數(shù)傳遞,參數(shù)以廣播的模式在系統(tǒng)總線上傳輸,各模塊按需接收參數(shù)信息,并進(jìn)行業(yè)務(wù)處理。
1、子模塊功能組件創(chuàng)建
該發(fā)明方法是基于組件式設(shè)計(jì)模式下的,模塊間參數(shù)傳遞方法,子功能模塊需要按照Prism組件式開(kāi)發(fā)方式來(lái)進(jìn)行設(shè)計(jì)與實(shí)現(xiàn),每個(gè)子模塊應(yīng)包含如下特性:
①子模塊對(duì)系統(tǒng)的其他子模塊而言應(yīng)該是相對(duì)獨(dú)立的;
②子模塊之間不能相互引用;
③子模塊不能維護(hù)其依賴(lài)項(xiàng),這些依賴(lài)項(xiàng)應(yīng)該由模塊外部系統(tǒng)框架提供,如:注入依賴(lài);
④子模塊應(yīng)該支持熱插拔動(dòng)態(tài)集成;
每一個(gè)子功能模塊都是一個(gè)獨(dú)立的工程,并且都存在一個(gè)Module類(lèi),該類(lèi)實(shí)現(xiàn)了Prism的IModule接口。在IModule接口中存在方法Initialize(),所有子功能模塊的Module類(lèi)必須重寫(xiě)這個(gè)方法來(lái)定義其模塊的初始化策略,而Prism的ModuleLoader在加載模塊的時(shí)候也會(huì)調(diào)用這個(gè)方法來(lái)完成模塊的初始化工作。在子模塊的初始化工作中,子功能模塊需要向主框架進(jìn)行對(duì)應(yīng)頁(yè)面的依賴(lài)注入,首先通過(guò)子模塊的Module類(lèi)的構(gòu)造函數(shù)來(lái)獲取系統(tǒng)的RegionManager,之后通過(guò)RegionManager來(lái)完成子模塊對(duì)應(yīng)頁(yè)面在系統(tǒng)主框架的注入,另外每 一個(gè)子模塊在系統(tǒng)加載前向主框架配置文件注冊(cè)相關(guān)配置信息,包含信息如下:組件動(dòng)態(tài)庫(kù)名、子模塊類(lèi)型、子模塊的模塊名、是否啟動(dòng)時(shí)自動(dòng)加載子模塊。
2、系統(tǒng)主框架的創(chuàng)建
系統(tǒng)主框架的主要功能為承載子功能模塊,每個(gè)子模塊功能組件通過(guò)Prism提供的依賴(lài)注入方式集成到系統(tǒng)主框架,只有承載在主框架中的子模塊才能運(yùn)行與調(diào)試,同時(shí)系統(tǒng)主框架提供系統(tǒng)總線用于承載參數(shù)信息,各個(gè)子模塊向系統(tǒng)總線發(fā)送和接收參數(shù)信息。
首先系統(tǒng)主框架提供一個(gè)主加載頁(yè)面,在主加載頁(yè)面中定義一個(gè)頁(yè)面注入?yún)^(qū)域:MainRegion,用于完成對(duì)各個(gè)子模塊頁(yè)面的注入。當(dāng)前臺(tái)界面需要顯示某一子模塊頁(yè)面信息時(shí),系統(tǒng)將對(duì)應(yīng)頁(yè)面注冊(cè)到MainRegion區(qū)域,并將其激活。當(dāng)某一頁(yè)面退出時(shí),主框架將對(duì)應(yīng)頁(yè)面從MainRegion中移除。
3、子模塊功能組件間參數(shù)傳遞
以上兩節(jié)介紹了子模塊功能組件的開(kāi)發(fā)方法以及其注入式集成方式,下面著重介紹各個(gè)獨(dú)立的功能組件之間是如何實(shí)現(xiàn)參數(shù)傳遞的。首先集成到系統(tǒng)框架的功能組件并不是固定的參數(shù)發(fā)送者或參數(shù)接收者,可根據(jù)實(shí)際的需求來(lái)轉(zhuǎn)換相應(yīng)的角色。發(fā)送方將參數(shù)信息封裝并序列化后發(fā)送到系統(tǒng)總線,而參數(shù)接收方向系統(tǒng)總線訂閱參數(shù)信息,實(shí)現(xiàn)參數(shù)在不同功能組件之間的靈活傳遞,具體步驟如下:
首先系統(tǒng)的任意模塊,如圖2模塊1向系統(tǒng)總線發(fā)布參數(shù)信息,在發(fā)布參數(shù)信息之前需要對(duì)其進(jìn)行一系列的相關(guān)封裝處理:
①參數(shù)封裝,依據(jù)定義的消息類(lèi)對(duì)參數(shù)信息進(jìn)行封裝,包括:
消息頭:消息類(lèi)型、發(fā)送頁(yè)面名稱(chēng)
消息體:參數(shù)信息。
②消息信息序列化:
通過(guò)xml序列化函數(shù)實(shí)現(xiàn)發(fā)送對(duì)象的序列化功能,將封裝后的消息對(duì)象序列化為字符串信息。
之后模塊1將封裝處理之后的參數(shù)信息發(fā)布到系統(tǒng)總線,發(fā)送模塊通過(guò)Prism提供的類(lèi)庫(kù)將序列化后的字符串消息的發(fā)布到系統(tǒng)總線。具體采用Prism框架體提供的專(zhuān)門(mén)用于發(fā)布與訂閱的功能函數(shù)CompositePresentationEvent。
有參數(shù)需求的模塊向系統(tǒng)總線訂閱參數(shù)信息,在接收到總線上傳輸?shù)南⒅?,?duì)其進(jìn)行一系列的拆封和判斷操作,最終對(duì)參數(shù)信息進(jìn)行處理。參數(shù)接收處理流程如下:
①消息頭信息的注冊(cè)
將消息頭信息注冊(cè)到接收頁(yè)面的初始化列表中,包括消息類(lèi)型及發(fā)送頁(yè)面的注冊(cè)。該列表作為接收頁(yè)面是否處理系統(tǒng)總線上傳遞的參數(shù)的依據(jù)。
②消息訂閱
通過(guò)Prism提供的類(lèi)庫(kù)來(lái)實(shí)現(xiàn)對(duì)字符串格式消息的訂閱功能,只有訂閱之后的頁(yè)面才能夠接收到總線上傳遞的消息。具體采用Prism框架體提供的專(zhuān)門(mén)用于接收總線上的消息的功能函數(shù)CompositePresentationEvent。
③消息接收與拆封
接收系統(tǒng)總線發(fā)送的字符串格式的消息信息,應(yīng)用xml反序列化函數(shù)將消息對(duì)象拆封,獲取消息頭,根據(jù)消息類(lèi)型及發(fā)送頁(yè)面名來(lái)判斷是否對(duì)接收的總線消息進(jìn)行處理。對(duì)于要處理的消息將消息體傳送到參數(shù)處理函數(shù),對(duì)參數(shù)進(jìn)行處理。
④參數(shù)處理
參數(shù)處理函數(shù)根據(jù)需求設(shè)定,接收要處理的消息體,通過(guò)xml提供的反序列化函數(shù)將消息體拆封,獲取真正要接收的參數(shù)信息,之后根據(jù)業(yè)務(wù)需求對(duì)參數(shù)進(jìn)行操作。
該方法的實(shí)施方式如下:
1、分解業(yè)務(wù)需求,拆分子功能模塊,系統(tǒng)要求各個(gè)子功能模塊具備較小的耦合性,同時(shí)能夠彼此進(jìn)行數(shù)據(jù)傳遞,子模塊與主框架的集成方式簡(jiǎn)單,可以根據(jù)需求任意安裝卸載,這樣可以最大程度的實(shí)現(xiàn)企業(yè)信息系統(tǒng)的通用性, 也實(shí)現(xiàn)了針對(duì)不同企業(yè)需求系統(tǒng)功能加載的靈活性。如圖1所示上側(cè)為系統(tǒng)各個(gè)功能模塊,每一個(gè)圓形代表一個(gè)功能模塊,各個(gè)功能模塊相對(duì)獨(dú)立,同時(shí)圓形之間以帶箭頭的曲線連接,代表功能模塊之間存在數(shù)據(jù)傳輸,箭頭的方向代表了數(shù)據(jù)的傳輸方向。下面為系統(tǒng)主框架,用于集成各個(gè)子功能模塊,子模塊與主框架的集成方式為自動(dòng)插拔式集成,便于功能模塊的集成與卸載。
2、創(chuàng)建系統(tǒng)主框架,創(chuàng)建系統(tǒng)主加載頁(yè)面,在主加載頁(yè)面內(nèi)定義注入?yún)^(qū)域MainRegion。
3、創(chuàng)建子模塊工程,引用Prism動(dòng)態(tài)庫(kù)文件,采用組件式開(kāi)發(fā)模式設(shè)計(jì)開(kāi)發(fā)子模塊,為子模塊創(chuàng)建Module類(lèi),用于實(shí)現(xiàn)IModule接口,重寫(xiě)Initialize()函數(shù),定義模塊初始化策略。同時(shí)在初始化過(guò)程中利用Prism提供的RegionManager來(lái)注入子模塊頁(yè)面。
4、發(fā)送參數(shù)模塊封裝參數(shù)信息,創(chuàng)建發(fā)送消息,消息格式如下:
消息頭:發(fā)送頁(yè)名稱(chēng)+消息類(lèi)型
消息體:參數(shù)信息對(duì)象
5、發(fā)送參數(shù)模塊序列化封裝好的消息信息,并將消息信息序列化為字符串格式。
6、發(fā)送參數(shù)模塊利用Prism提供的庫(kù)函數(shù)將消息廣播到系統(tǒng)總線。
7、接收模塊初始化接收消息的類(lèi)型,及發(fā)送消息的頁(yè)面列表。
8、接收模塊利用Prism庫(kù)函數(shù)在系統(tǒng)總線上訂閱消息。
9、接收模塊接收系統(tǒng)總線上廣播的消息。
10、接收模塊反序列化字符串格式的消息信息,獲取消息對(duì)象信息。
11、接收模塊利用事先定義好的接收消息類(lèi)型及發(fā)送消息的頁(yè)面列表來(lái)判斷消息頭信息是否符合規(guī)則,從而決定處理還是拋棄消息。
12、接收模塊對(duì)符合要求的消息進(jìn)行拆封,獲取消息體,即傳遞的參數(shù)信息,并對(duì)參數(shù)信息進(jìn)行業(yè)務(wù)邏輯處理。