插件機制實現的原理是什麼?

作為自由碼農,對插件機制很感興趣所以想研究一下。比如我想開發一個論壇,支持通過添加插件來添加功能 。但是我一直不知道插件機制的代碼如何設計 ,不知道有沒有關於這方面技術的書籍,或者相關的學習博客。

通過下午的google,都是看一些比較零碎的文章介紹,如wordpress的插件機制,但感覺腦海中的理論不夠系統 ,所以還是希望能看一些比較系統的理論介紹。


@vczh 說的VS太高大上了,其實你只是想要一個論壇這樣的網站支持插件的話,認真把ASP.NET MVC的文章啊,代碼啊什麼的好好讀讀。看看這貨是怎麼發現那些Controller,怎麼映射URL到Action的。

說白了http://ASP.NET Runtime就是個超級插件容器,任何放在bin下面的DLL都會被自動載入,做http://ASP.NET Web開發真的不要太省心,,,,


所有的動態的resolving的機制最後都會變成如何獲取一個函數指針的問題,然後產生出了很多設計模式。Visual Studio功能強大,其實也是用插件插出來的,所以才能被插成SQLServer Management Studio那樣子的東西。如果你要開發一個類似的東西,你可以先看看VS的api,感受一下,然後自己再山寨。


Hooking


維基百科 Plug-in (computing) 有一幅圖我想能比較好的說明插件的機理。

  1. 主程序如果希望自身的功能可以被擴展,其需要:
    1. 提供一組服務 (Service Interface)。其提供(約束)了插件對主體能力可控制的邊界。服務定義的越精細,插件控制的粒度越小,能力越大,但耦合度和複雜度也越高。
    2. 定義一種擴展契約 (Plug-In Interface),其描述了插件應該如何設計以便於主程序發現。並通過插件管理模塊 (Plug-In Manager) 來發現、維護插件。
  2. 插件通過實現主程序規定的擴展契約(通常是一個介面),標明自己的身份,並接收來自主程序的事件響應。通過調動主程序提供的服務,實現和主程序的交互。這一過程,通常都是被主程序以 SDK (Software Development Kit) 的形式封裝。

基本上我們日常所有能接觸到的應用都或多或少的提供了插件機制,比如操作系統。其上面運行的應用程序即可以理解為它的插件實現。


以前用Delphi實現過一個完整的支持插件的C/S系統,除了核心的功能如資料庫、用戶、許可權、系統設置等功能外,其餘的功能模塊都是通過插件DLL方式掛載進來的。

這樣的結構,使得開發過程中團隊分工、單元測試、自動測試、系統部署的增量更新等等變得很容易。

基本的原理就是,

1、主程序定義並實現供插件使用的介面,通過共享內存方式傳遞給插件DLL使用。這是一個暴露介面的過程。

2、插件DLL按照規範導出一個或多個介面函數,主程序通過調用這些函數獲得插件的信息,檢查合法性通過後,載入到系統中。這是一個功能註冊/發現的過程。

3、通過事先定義好規範,主程序根據用戶操作調用插件功能,插件也可以提供自己的界面給用戶,也可以調用主程序的功能,非常方便。

4、C/S程序還需要考慮插接的卸載機制,確保資源正常釋放。

5、原則上只允許主程序和插件之間的調用,不允許插件與插件之間的調用,以確保資源的正確使用,也降低耦合性。

其實插件機制核心的東西就是樓上說的面向介面編程。所有的可二次開發的系統都可以說提供了插件機制。

手機答,輕拍,謝謝


插件化系統的原理

「面向介面編程而不是實現編程」

插件化系統的構成

「基礎庫+微內核+系統插件+應用插件」

其中微內核 負責如下功能:

  • 負責插件的載入、檢測、初始化;

  • 負責服務的註冊、調用;

  • 服務的管理。

插件化系統的目標

  • 使用者能通過規範,開發自己的插件,實用已有的插件,插件又能控制對外暴露的內容。

  • 運行時候能動態安裝、啟動、停在、卸載

  • 每一個插件提供一個或多個服務,其他插件是根據介面來獲取服務提供者

eclipse就是典型的插件系統,Eclipse選擇OSGi作為其插件的底層運行時架構。可以去了解下eclipse和osgi。


就是契約式編程。跟團隊編程不一樣的是因為沒有太多交流的機會,所以就定下一定的規範,插件開發者遵守就可以了。代碼上只要按規範讀取插件代碼就可以了。象wordpress這樣的實現上就很簡單。象OSGI就比較複雜,因為有classpath的載入問題,處理好了,就可以動態載入、卸載。處理不好,就得象firefox, idea這樣的要重啟下才可以使插件有效工作。


我知道一些,但是不知道這算不算插件

一個插件可以拿到系統的引用,並可以對系統進行監聽,對系統的狀態進行修改.

對於一個支持插件的系統來說,系統會在合適的時候載入插件,並且把系統引用傳入插件內部.

表述得不是很好,可能只有我自己理解吧


插件機制的價值,在於讓用戶能夠在既有的產品里貢獻自己的功能。

插件機制的模型,一般可以簡單拆分為擴展點 - 擴展,類似於介面 - 實現。關於擴展(一般以插件形式存在)的功能邊界,則由載入擴展的邏輯來定義(基於抽象編程)。

而要建立插件體系,一般就需要處理好擴展點的定義、擴展內容的管理、動態載入及卸載等一系列問題。

……


題主一提到 WordPress 我整個人都高潮了好不好~

上高中的時候寫過好幾個 WP 插件。其實 WP 之所以能夠那麼 popular,一個原因就是插件 API 真的很友好。

至今都記得一行就搞定的 add_action、add_filter。其實本質上 add_action 也可以看作是 add_filter 的語法糖吧。所以其實就是添加很多的 hook,在 hook 上允許放置各種 filter 篡改數據。


面向介面編程。就是這樣。不同的語言,不同的系統具體實現方式不同。比如java中可以使用配置文件和反射機制實現。


推薦閱讀:

有哪些炫酷的wordpress主題?

TAG:程序員 | 代碼 | WordPress插件 | jQuery插件 |