天天看點

建構插件式的應用程式架構(一)-開篇

說起插件(plug-in)式的應用程式大家應該不陌生吧,記得很早以前有一款很流行的MP3播放軟體winmap,它是我記憶裡最早認識的一款使用插件模式的應用程式,你可以使用他的插件管理器插入很多的音樂效果器,皮膚,甚至是歌詞顯示的面闆。接下來看到了Photoshop使用插件模式管理慮鏡。最後發現隻要是大一點的應用程式基本都使用了插件式的程式架構,就拿我們最常用的工具來說吧,Visual Studio,Office,Delphi,Eclipse等等。Eclipse将插件模式發揮到了及至,因為他是開源的的,是以衆多的愛好者,開發出了讓人應接不暇的插件。

為什麼使用插件式的應用程式架構呢?我的答案就是他為應用程式的功能擴充提供的無限的想象空間。一個應用程式,無論你前期做了多少的市場調查,需求分析做的多麼完美,你也隻是迎合一部分人的期望,更甚,你隻迎合了一部分人的一部分期望,或者一部分人在某一時間的一部分期望。是以當程式釋出以後,你依然有機會提供新的功能而不必重新釋出程式,人們也可以根據自己的需要來開發新的功能來滿足自己的需求,據我所知有很多的軟體公司就是專門開發插件來賺錢,真是一舉多得,何樂而不為呢?

我們來看一些常見的提供插件模式的應用程式是如何實作插件功能的。據我的使用經驗來看,Visual Studio和Office其實都是自動化程式,通過COM的方式提供了一組接口。開發人員可以利用這些接口來開發基于COM的插件,當插件開發完成後,注冊COM元件。在Visual Studio中你可以使用Add-in管理器來選擇是否啟用插件,而Office似乎省去了這一步,一旦你注冊了Office插件,Office應用程式在啟動的時候會自動加載插件。COM方式似乎最受微軟的寵愛,因為COM是一種二進制重用标準,使用者可以使用大部分流行的語言來開發插件。當然你也可以使用别的方式,比如普通DLL,隻是這樣對于開發人員來說适用面就窄了,因為各個廠商DLL的内部結構是不盡相同的,比VC開發出的DLL和Borland C++builder開發出的DLL結構就不同,需要專門的工具進行轉換。現在,還有另外一種方式,使用dotNet的Assembly,使用dotNet的好處是開發簡單,使用也同樣簡單(不需要注冊),而且你也可用通過COM互操作讓開發人員可以使用各種語言進行插件開發,當然用dotNet開發還是最簡單的,省去不少中間過程。

其實上面介紹的三種方式開發的插件最終還是寄宿在DLL中,從中我們就可以看出一些端倪。為什麼使用DLL呢?DLL雖然也是PE格式,但是他是不能獨立運作的,一般情況下,都是在運作時加載到應用程式的記憶體空間。插件模式正好是利用了這一點,插件不是應用程式的一部分,他以二進制的方式獨立存在,由使用者決定是否使用他。

那麼插件是如何與應用程式進行互動的呢?首先必須有一個契約,應用程式要聲明我有哪些功能是可以被插件使用的,并且具備什麼條件才能成為我的插件。其次,應用程式不依賴于插件,也就是說,沒有你插件,我也可以很好的運作。再次,應用程式必須有一種政策來擷取插件存在的位置,比如Visual studio是通過系統資料庫的方式。最後,應用程式可以通過某種方式動态的加載插件。

繼續閱讀