這是大約在3-4年前完成的一個C#實現的OSGi框架,實現的過程參照了OSGi規範與與一些實現思路(感謝當時的那些資料與項目),此框架雖然僅在幾個小型項目有過實際的應用,但OSGi的規範實現還是相對比較完整的,包涵了一些基本的要素,由於個人的項目重心已經轉移,現在打算把它公開出來,供大家參考: G... ...
這是大約在3-4年前完成的一個C#實現的OSGi框架,實現的過程參照了OSGi規範與與一些實現思路(感謝當時的那些資料與項目),此框架雖然僅在幾個小型項目有過實際的應用,但OSGi的規範實現還是相對比較完整的,包涵了一些基本的要素,由於個人的項目重心已經轉移,現在打算把它公開出來,供大家參考:
OSGi.NET框架是一個參照了OSGi規範的模塊化管理框架。框架為應用程式擴展(組件(bundle))提供了一個標準環境。整個框架可以劃分為一些層次:
- 1.運行環境
- 2.模塊(Bundle)
- 3.生命周期管理
- 4.服務註冊
- 5.擴展點支持
目前OSGi.NET具有如下特色:
- 1.組件的可插拔性:組件可根據業務需要在運行時進行裝載、卸載操作
- 2.組件的動態更新:組件在運行時可更新替換當前版本
- 3.組件的版本隔離:不同組件引用相同產品的不同版本程式集可以版本隔離
- 4.組件完整的生命周期:包括已安裝、已裝載、已激活、啟動中、停止中、已卸載
- 5.組件的載入順序:組件載入根據業務要求可設置載入級別來控制載入次序
- 6.組件的通信支持:組件間通過面向服務的編程模型來達到組件間通信、調用的目的
- 7.組件的擴展支持:組件提供了擴展點及其擴展來滿足某個組件的擴展性支持
啟動一個OSGi.NET應用程式僅需要如下代碼
using System; using OSGi.NET.Core.Root; namespace ConsoleDemo { class Program { static void Main(string[] args) { //創建框架工廠 var frameworkFactory = new FrameworkFactory(); //創建框架內核 var framework = frameworkFactory.CreateFramework(); //初始化框架 framework.Init(); //啟動框架 framework.Start(); Console.ReadLine(); } } }
創建一個OSGi.NET項目需要:
1.引用框架內核程式集OSGi.NET.dll
2.添加框架內核配置文件OSGi.NET.properties
3.如需要日誌支持,添加log4net.config文件及log4net.dll程式集引用
OSGi.NET項目的預設文件目錄結構如下
/程式目錄
/程式目錄/Bundles/
/程式目錄/Bundles/模塊A/
/程式目錄/Bundles/模塊A/Manifest.xml
/程式目錄/Bundles/模塊A/模塊A.dll
/程式目錄/Bundles/模塊A/Libs/
/程式目錄/Bundles/模塊A/Libs/* .dll
/程式目錄/Bundles/模塊B/
/程式目錄/Bundles/模塊C/
/程式目錄/Libs/(可選)
/程式目錄/OSGi.NET.properties
註:
程式目錄中的Libs文件夾存放個Bundles的共用程式集(也可通過在配置文件中配置共用清單),如介面契約、公共第三方類庫等。
模塊A中的Libs文件夾存放其私有程式集。
Manifest.xml作為程式清單文件對模塊進行自描述。
OSGi.NET.properties為框架內核配置文件
關於載入次序:
由於業務需求,各模塊存在依賴關係的可能,所以模塊載入也會有載入順序的要求,此時可以通過清單文件中Manifest.xml,Bundle節點的StartLevel屬性對其載入次序進行設置。數值越小,載入越前。
關於Bundle引用程式集搜索原則:
1.根據載入的Bundle引用程式集,依據程式集名稱+版本號匹配原則,優先從[/程式目錄/Libs/]目錄或共用清單中搜索。
2.如第一步無匹配,則根據程式集名稱從[/程式目錄/Bundles/模塊A/Libs/*.dll]目錄搜索,並將搜索到的程式集對應版本關聯Bundle。
3.各Bundle下Libs目錄程式集在載入中做了Bundle間的隔離,確保不同的Bundle引用的程式集間不會造成影響。即:如存在共用程式集請放置[/程式目錄/Libs/]目錄或在共用清單配置。
Intro: http://www.diginfo.me/osgi-net-implement
源代碼 https://github.com/FreezeSoul/OSGi.NET