成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

插件式開發架構綜述

開發 架構
現代軟件提供插件式開發架構,一方面是服務于產品自身內部開發,另外一方面服務于市場化。

[[421758]]

1. 概述

在現有軟件開發中,業務越來越復雜,代碼規模越來越大,依賴的人力也越來越多。為了降低系統模塊內部耦合度,減少開發難度,也為了能夠支持多團隊的并行開發,插件式開發架構變得愈加流行,尤其是在桌面軟件、移動端應用中。對于后端開發,微服務的形式也越來越流行,但是據筆者看來,微服務的很多設計思路,和插件式開發架構的設計理念也有相近之處。Eclipse, Visual Studio, VSCode等,都是插件式開發架構的典型案例。

現代軟件提供插件式開發架構,一方面是服務于產品自身內部開發,另外一方面服務于市場化。借助于市場上各領域開發人員,在某一款軟件(開源or商業)上進行面向新領域的開發,可以大大提高該產品的市場占有率,并衍生出一系列各領域的代理商及咨詢業務。

2. 插件式開發架構要領

不管基于何種語言進行插件式開發框架的設計,有一些共同的要點需要具備。

2.1 插件運行主體

基于插件模式進行開發的軟件,一般會存在一個運行主體。這個載體作為應用的主入口,并根據各類插件的配置信息,將編譯或打包后的插件加載到主體環境中并執行。開發新的插件,無需調整現有運行主體的代碼和二進制包。

2.2 插件的注入、配置和初始化

2.2.1 插件配置信息

配置信息即插件的描述信息,可以在代碼中設置,也可以通過XML文件實現,方式不同,目的一致。

  • 插件名稱
  • 插件版本號
  • 插件描述信息
  • 依賴的其他插件清單

2.2.2 插件的注入及初始化

插件的注入及初始化一般借助于繼承插件基類,并實現插件框架中指定好的標準接口。通過繼承插件基類,實現插件的注入;通過實現標準的初始化、啟動、關閉等標準接口,實現插件的生命周期管理工作。

2.2.2.1 插件定義示例

下文代碼是筆者參考開源軟件Xfrogcn.PluginFactory做的說明。

https://gitee.com/WuYeCai/pluginfactory

  • 通過C#語言的Attribute特性對插件進行描述
  • 通過實現Init, StartAsync, StopAsync標準接口初始化、啟動或關閉插件。這是對插件生命周期的管理。
  1. [Plugin(Alias = "PluginA", Description = "測試插件")] 
  2.  public class Plugin :: PluginBase, ISupportInitPlugin 
  3.  { 
  4.     public void Init(IPluginInitContext context) 
  5.     { 
  6.         //自定義初始化行為 
  7.     } 
  8.       
  9.      public override Task StartAsync(IPluginContext context) 
  10.      { 
  11.          //自定義啟動行為 
  12.          return base.StartAsync(context); 
  13.      } 
  14.  
  15.      public override Task StopAsync(IPluginContext context) 
  16.      { 
  17.          //自定義關閉行為 
  18.          return base.StopAsync(context); 
  19.      } 
  20.  } 

2.3. 插件通信機制

插件通信機制是一種通用概念。當各插件間協同完成一個功能時,彼此進行協調互助的一種機制。交互的形式有很多種,一種是插件對外開放自己的接口,接入到服務總線中供其他插件調用;一種是提供消息機制,插件之間通過發送消息進行事件處理。

2.3.1 基于虛擬服務總線形式的通信機制

基于虛擬服務總線形式的通信機制,每個插件都有自己的開放接口,這些接口會被注冊到虛擬服務總線上,其他插件通過虛擬服務總線,獲取到其他插件的接口服務。此處涉及到的內容是面向接口編程。

2.3.2 插件間消息通信

插件間消息通信屬于一種開發人員可以自定義的擴展方式,插件運行主體無法定義所有的消息類型及消息的處理方法。所以用戶可以通過約定消息形式以及自定義消息響應函數,實現插件間的通信。但是這樣其實增強了插件之間的耦合度,不是特別推薦。筆者建議應用層插件盡量只依賴通用服務型插件及主體運行程序,業務插件保持獨立。

3. C++語言下的插件開發案例

筆者曾基于某國外通用產品,進行領域化定制。該產品基于C++/MFC開發,并提供SDK包和樣例工程,輔助用戶基于該產品的插件開發。每個插件最終會編譯為一個DLL,拷貝到產品指定目錄下,就會被加載并執行。整體模式如下圖所示。

  • 支持插件注入接口

通過繼承插件中指定的基類并實現指定接口,達到插件注冊及初始化的效果。

  • 支持用于注入菜單及子菜單的接口

通過菜單注入接口,開發人員可以在菜單中提供插件功能入口。用戶可以通過該入口啟用該插件。

  • 支持事件分發(已定義標準事件清單),插件可以接收事件,并開發自定義的事件處理程序

用戶在實際設計過程中針對模型、針對工程目錄、針對繪圖區域的操作,會分發到所有的插件中,類似于廣播。開發人員根據實際需要去實現或者不實現。

  • 提供接口,獲取當前上下文信息

提供訪問接口,用戶獲取用戶當前選中的模型對象、選中的目錄、選中的文件等信息。

  • 提供接口,用于所有業務對象的訪問

提供訪問接口,可以去創建、刪除模型,創建、刪除文件,創建刪除工程管理目錄等文件。

  • 插件以DLL的形式存在,進程內加載運行

4. JAVA體系下的插件開發案例

校園時代曾和同學一起開發過一款桌面端設計軟件,就是基于Eclipse的RCP技術。基于插件的架構、擴展點等概念,依舊印象深刻。其中開發的基石Eclipse,就是基于OSGI規范進行開發。

4.1 OSGI簡介

OSGi是基于java語言實現的開發期和運行期模塊化技術。它的核心部分是一個框架,其中定義了應用程序的生命周期模式和服務注冊。OSGI框架定義了大量的OSGI通用服務:日志、配置管理,XML解析等通用服務。

4.2 OSGI整體架構

4.2.1 模塊層

模塊層可以理解為開發出來的各類插件,一般以bundle的形式出現。一個完整的系統功能,往往由不同的模塊插件進行配合完成。模塊之間通過約定好的接口為外部提供服務。也確定了每個模塊的邊界,并進行封裝。

模塊層中bundle的特點:

  • bundle 以 jar 包形式存在的模塊化物理單元,包含了代碼,資源文件和元數據(模塊描述信息)。
  • bundle 是開發、部署 OSGi 應用的基本單元。
  • bundle 的核心是 META-NF 目錄下的 MANIFEST.MF 文件。
  • bundle 定義了內部包的對外可見性。
  • 每個 bundle 都有單獨的類加載器。

4.2.2 生命周期層

管理bundle的創建,銷毀。Bundle內部需要實現相關的接口,配合生命周期層的工作。

4.3.3 服務層

服務層可以理解為一個服務中心,每個插件將自己可以對外提供的功能通過服務層進行發布,并給其他插件提供了服務發現的方式及服務訪問。

4.3 Eclipse插件示例

Eclipse插件示例,采用Eclipse中自帶的Hello World案例進行說明。

插件的配置信息如下:

  1. Manifest-Version: 1.0 
  2. Bundle-ManifestVersion: 2 
  3. Bundle-Name: PluginDemo 
  4. Bundle-SymbolicName: PluginDemo 
  5. Bundle-Version: 1.0.0.qualifier 
  6. Bundle-Activator: plugindemo.Activator 
  7. Bundle-RequiredExecutionEnvironment: JavaSE-16 
  8. Automatic-Module-Name: PluginDemo 
  9. Import-Package: org.osgi.framework;version="1.3.0" 
  10. Bundle-ActivationPolicy: lazy 

一個簡單的插件示例代碼如下:

  1. package plugindemo; 
  2.  
  3. import org.osgi.framework.BundleActivator; 
  4. import org.osgi.framework.BundleContext; 
  5.  
  6. public class Activator implements BundleActivator { 
  7.  
  8.   @Override 
  9.   public void start(BundleContext context) throws Exception { 
  10.     System.out.println("Hello World!!"); 
  11.   } 
  12.    
  13.   @Override 
  14.   public void stop(BundleContext context) throws Exception { 
  15.     System.out.println("Goodbye World!!"); 
  16.   } 

采用Eclipse OSGI模式進行運行,結果輸入如下。

  1. WARNING: Using incubator modules: jdk.incubator.vector, jdk.incubator.foreign 
  2. Hello World!! 
  3. osgi> 22:48:00.337 [Worker-0: Loading available Gradle versions] INFO org.eclipse.buildship.core.internal.util.gradle.PublishedGradleVersions - Gradle version information cache is up-to-date. Trying to read
  4. !SESSION 2021-08-31 22:47:57.492 ----------------------------------------------- 

5. 總結

 

本文簡單說明了插件開發架構中的一些基本原則,以及采用不同語言開發的軟件平臺中的插件開發模式。需要注意的是,實際插件架構中,根據產品的不同、面向的領域不同、采用的編程語言不同,會有很多不一樣的設計,需要結合具體情況進行設計。

 

責任編輯:武曉燕 來源: 一個程序員的修煉之路
相關推薦

2018-04-19 10:46:39

3N層框架

2011-06-03 10:15:13

2016-10-07 23:23:34

2021-07-30 13:46:59

前端架構插件

2020-10-30 07:47:42

分布式

2025-04-25 04:00:00

低代碼組件化元數據架構

2009-06-04 20:26:45

2013-04-15 16:56:48

微信公眾平臺Android開發

2025-05-19 08:26:37

RAG架構項目

2025-03-20 14:30:02

2023-08-20 12:37:44

前端開發

2012-05-28 09:50:32

jQuery插件

2009-06-03 16:06:28

Eclipse插件開發Eclipse

2019-01-31 09:33:50

CNN神經網絡激活函數

2012-07-02 14:47:57

架構敏捷開發

2009-06-12 16:07:05

演進式架構設計敏捷開發

2012-06-13 10:17:40

jQuery

2011-08-25 09:30:22

2022-08-02 08:01:09

開發插件Chrome前端技術

2011-08-29 14:50:08

jQuery插件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品婷婷 | www.国产.com| 中文字幕在线二区 | 亚洲精品在线看 | 在线一区视频 | www.狠狠干 | 亚洲精品乱码久久久久久9色 | 欧美黄色一级毛片 | www.天天操 | 91精品国产综合久久久久久首页 | 国产一级电影在线观看 | 国产福利在线播放麻豆 | 日韩av啪啪网站大全免费观看 | 一区二区三区四区视频 | 在线亚州| 国产精品久久久久久吹潮日韩动画 | 成人在线观看免费视频 | av色站| 91视频精选| 国产伦精品一区二区三区视频金莲 | 玖玖玖av| 中日韩毛片| 国产精品不卡一区二区三区 | 日韩二| 国产电影一区二区在线观看 | 国产精品久久99 | 亚洲一区不卡在线 | 国产一区二区三区在线 | 天天av综合 | 四虎在线观看 | 国产福利91精品 | 久久精品黄色 | 中文字幕国产 | 亚洲国内精品 | 久久久久久亚洲精品 | 91pron在线| 亚洲一区二区三区免费观看 | 国产精品久久久久久久久久免费看 | av一级 | 欧美一区在线视频 | 久久久久久国产精品 |