資源描述:
《構(gòu)建插件式的應(yīng)用程序框架》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、構(gòu)建插件式的應(yīng)用程序框架(一)----開篇?????說(shuō)起插件(plug-in)式的應(yīng)用程序大家應(yīng)該不陌生吧,記得很早以前有一款很流行的MP3播放軟件winmap,它是我記憶里最早認(rèn)識(shí)的一款使用插件模式的應(yīng)用程序,你可以使用他的插件管理器插入很多的音樂效果器,皮膚,甚至是歌詞顯示的面板。接下來(lái)看到了Photoshop使用插件模式管理慮鏡。最后發(fā)現(xiàn)只要是大一點(diǎn)的應(yīng)用程序基本都使用了插件式的程序框架,就拿我們最常用的工具來(lái)說(shuō)吧,VisualStudio,Office,Delphi,Eclipse等等。Eclipse將插件模式發(fā)揮到了及至,因?yàn)樗情_源的的,所以眾多的愛好者,開發(fā)
2、出了讓人應(yīng)接不暇的插件。??????為什么使用插件式的應(yīng)用程序框架呢?我的答案就是他為應(yīng)用程序的功能擴(kuò)展提供的無(wú)限的想象空間。一個(gè)應(yīng)用程序,無(wú)論你前期做了多少的市場(chǎng)調(diào)查,需求分析做的多么完美,你也只是迎合一部分人的期望,更甚,你只迎合了一部分人的一部分期望,或者一部分人在某一時(shí)間的一部分期望。所以當(dāng)程序發(fā)布以后,你依然有機(jī)會(huì)提供新的功能而不必重新發(fā)布程序,人們也可以根據(jù)自己的需要來(lái)開發(fā)新的功能來(lái)滿足自己的需求,據(jù)我所知有很多的軟件公司就是專門開發(fā)插件來(lái)賺錢,真是一舉多得,何樂而不為呢???????我們來(lái)看一些常見的提供插件模式的應(yīng)用程序是如何實(shí)現(xiàn)插件功能的。據(jù)我的使用經(jīng)驗(yàn)
3、來(lái)看,VisualStudio和Office其實(shí)都是自動(dòng)化程序,通過(guò)COM的方式提供了一組接口。開發(fā)人員可以利用這些接口來(lái)開發(fā)基于COM的插件,當(dāng)插件開發(fā)完成后,注冊(cè)COM組件。在VisualStudio中你可以使用Add-in管理器來(lái)選擇是否啟用插件,而Office似乎省去了這一步,一旦你注冊(cè)了Office插件,Office應(yīng)用程序在啟動(dòng)的時(shí)候會(huì)自動(dòng)加載插件。COM方式似乎最受微軟的寵愛,因?yàn)镃OM是一種二進(jìn)制重用標(biāo)準(zhǔn),用戶可以使用大部分流行的語(yǔ)言來(lái)開發(fā)插件。當(dāng)然你也可以使用別的方式,比如普通DLL,只是這樣對(duì)于開發(fā)人員來(lái)說(shuō)適用面就窄了,因?yàn)楦鱾€(gè)廠商DLL的內(nèi)部結(jié)構(gòu)是不
4、盡相同的,比VC開發(fā)出的DLL和BorlandC++builder開發(fā)出的DLL結(jié)構(gòu)就不同,需要專門的工具進(jìn)行轉(zhuǎn)換?,F(xiàn)在,還有另外一種方式,使用dotNet的Assembly,使用dotNet的好處是開發(fā)簡(jiǎn)單,使用也同樣簡(jiǎn)單(不需要注冊(cè)),而且你也可用通過(guò)COM互操作讓開發(fā)人員可以使用各種語(yǔ)言進(jìn)行插件開發(fā),當(dāng)然用dotNet開發(fā)還是最簡(jiǎn)單的,省去不少中間過(guò)程。?????????其實(shí)上面介紹的三種方式開發(fā)的插件最終還是寄宿在DLL中,從中我們就可以看出一些端倪。為什么使用DLL呢?DLL雖然也是PE格式,但是他是不能獨(dú)立運(yùn)行的,一般情況下,都是在運(yùn)行時(shí)加載到應(yīng)用程序的內(nèi)存空
5、間。插件模式正好是利用了這一點(diǎn),插件不是應(yīng)用程序的一部分,他以二進(jìn)制的方式獨(dú)立存在,由用戶決定是否使用他。??????那么插件是如何與應(yīng)用程序進(jìn)行交互的呢?首先必須有一個(gè)契約,應(yīng)用程序要聲明我有哪些功能是可以被插件使用的,并且具備什么條件才能成為我的插件。其次,應(yīng)ufida16用程序不依賴于插件,也就是說(shuō),沒有你插件,我也可以很好的運(yùn)行。再次,應(yīng)用程序必須有一種策略來(lái)獲取插件存在的位置,比如Visualstudio是通過(guò)注冊(cè)表的方式。最后,應(yīng)用程序可以通過(guò)某種方式動(dòng)態(tài)的加載插件。??????最近工作比較忙,沒有時(shí)間寫B(tài)log,控件開發(fā)總結(jié)的那個(gè)系列停在那里好久了,汗一個(gè),
6、有空就盡快補(bǔ)上吧。這個(gè)系列也先開個(gè)頭吧,不然又會(huì)被自己找各種借口扼殺了。構(gòu)建插件式的應(yīng)用程序框架(二)----訂立契約無(wú)論是用COM的方式,還是普通DLL,抑或.NET方式來(lái)實(shí)現(xiàn)插件框架,首先要面臨的問(wèn)題就是如何訂立契約。如同我上一篇文章講到的一樣,契約是應(yīng)用程序和插件之間進(jìn)行交互的依據(jù)和憑證。應(yīng)用程序必須聲明我有什么樣的功能可被插件使用,并且插件必須符合什么條件才能被我使用。反之,插件必須要知道應(yīng)用程序提供什么樣的功能,我才能將自己的功能融入到應(yīng)用程序的體系中。本系列文章主要講如何使用.NET實(shí)現(xiàn)插件式的應(yīng)用程序框架,所以其它的方式我就不再提了。如何使用.NET訂立契約
7、呢?首先想到的Interface,其次是抽象類,但是在插件模式中我使用接口,因?yàn)槲覀兪窃跐M足應(yīng)用程序的主要目的的基礎(chǔ)上來(lái)提供附加的插件功能,就這一點(diǎn)來(lái)說(shuō),接口更靈活,更容易擴(kuò)展。接下來(lái),如何訂立契約的內(nèi)容呢?這就要根據(jù)你的業(yè)務(wù)需求了,為了講解的方便,我們定義一個(gè)最最基本的插件式應(yīng)用程序的插件契約。我們做一個(gè)假定,我們的應(yīng)用程序是一個(gè)多文檔的應(yīng)用程序,包含一個(gè)主菜單欄,一個(gè)工具欄,菜單欄可以在程序的上下左右四個(gè)方向???,另外還有一個(gè)狀態(tài)欄。到后邊,如果有必要,我會(huì)擴(kuò)展這個(gè)應(yīng)用程序,讓他本身提供更多的可供插件使用的功能。所以就目前