關于osgi.net ,想必大家也聽說過,以下是自己在學習osgi.net 過程中整理出來的內容,供大家學習參與使用。
1. UIOSP 開放工廠框架架構
開放工廠所有插件基于OSGi.NET面向服務插件框架構建。該框架是國際上第一個完整遷移了OSGi R4規范的OSGi.NET框架,提供了動態模塊化、面向服務和模塊擴展三大功能,支持WinForm桌面應用、WPF桌面應用、ASP.NET Web應用、ASP.NET MVC應用、Silverlight RIA應用、手機應用等任意.NET應用環境
1.1 開放工廠架構
開放工廠由OSGi.NET插件框架和插件倉庫組成
- OSGi.NET插件框架:它是OSGi R4規范移植到.NET平臺的實現,提供了動態模塊化、面向服務架構和模塊擴展三大功能。在這里,模塊具備物理隔離性、熱插拔、動態性和物理重用性。
- 插件倉庫:它是一個在線的插件倉庫,所有插件均符合OSGi.NET規范,可運行在OSGi.NET插件框架之上。您可以從插件倉庫中任意挑選插件進行組裝,也可以開發新的插件進行功能擴展。
1.2 開放工廠具有六方面的價值
2. 插件框架原理
2.1 插件和插件運行時
在OSGi.NET插件框架中,插件即Bundle,它具備物理隔離、熱插拔和動態特性。每一個插件都是完全可復用的,可以被動態的安裝、啟動、停止、卸載或更新。插件運行時即BundleRuntime,則是插件的運行容器,它負責從插件目錄中加載和啟動插件。
2.2 面向服務
在OSGi.NET插件框架中,插件具備高內聚、低耦合特性,也就是說插件間耦合度非常低。服務即Service,是插件通訊的方式。在這里,“服務=接口 + 實現”。接口是服務的契約(即接口),服務提供商實現了服務的接口并將服務注冊到服務總線,服務消費者則通過服務契約從服務總線搜索服務并綁定使用。這里,服務是動態,可以被動態注冊、卸載和更新,一個服務契約也可能有多個服務實現。
2.3 插件擴展
在OSGi.NET插件框架,插件具備可擴展性,可以在不變更插件代碼情況下,更改或者擴展插件的行為。這個擴展機制是通過一對基于XML格式的“擴展點 + 擴展”來實現的。一個插件可以通過定義“擴展點”來實現可擴展,而其它插件則通過定義對應的“擴展”來注冊/更新功能。擴展/擴展點在插件啟動時注冊到插件運行時,相反,在卸載時,則從插件運行時卸載。
2.4 片段插件
在OSGi.NET,有一種特殊的插件,稱為片段插件,即Fragment Bundle。片段插件相當于子插件,其作用是為了擴充其它插件的類型空間、擴展信息。除了片段插件的插件,都是宿主插件(Host Bundle)。與宿主插件不同的是,片段插件不能被啟動、停止,沒有類加載器,不允許從片段插件加載類型。當宿主插件被啟動后,片段插件會自動附加到宿主插件,即將片段插件的類型空間、擴展信息合并到宿主插件。
3. 開放工廠原理
3.1 開放工廠原理概述
插件生命周期順序:
7(更新升級內核)->5,6(被啟動的插件調用插件管理服務來更新升級插件)->1(獲取頁面流服務,入口點插件,進入主界面) -> 4,6(插件中心插件調用插件管理服務,更新升級插件)->2,3(遠程控制)
當插件程序運行后,它首先調用iOpenWorks啟動程序來檢測OSGi.NET插件框架等內核文件版本并下載更新,接著啟動插件運行時, 從Plugins目錄中加載并啟動插件。在這里,iOpenWorks啟動程序將調用開放工廠平臺的插件倉庫OpenAPI檢查是否有新版本的內核并從 倉庫中下載最新版本的文件(如原理圖的箭頭7所示)。
在啟動插件過程中,如果應用程序下載安裝了自動更新插件,該插件會調用插件管理服務來檢查插件倉庫更新情況,并自動下載最新版本 的更新包,等重新啟動應用程序時,執行自動更新。在這里,插件管理服務將調用開放工廠平臺的插件倉庫OpenAPI來獲取插件倉庫的新插件 和新版本的插件并利用OpenAPI進行下載安裝或升級插件(如原理圖的箭頭5、6所示)。
插件運行時啟動完成后,主程序從運行時獲取頁面流服務,獲取入口點并運行入口插件的程序,進入主界面或者插件中心插件(如原理圖的箭頭1所示)。
插件中心插件也將調用插件管理服務,獲取開放工廠插件倉庫的新插件和插件的最新版本,當點擊下載插件時,利用插件管理服務從插件倉庫 下載安裝或升級插件(如原理圖的箭頭4、6所示)。
此外,當插件運行時啟動完成后,遠程管理服務插件利用WebService服務包裝器將OSGi.NET內核管理功能暴露成Web服務,這樣OSGi.NET 插件SDK的遠程管理控制臺運行起來后,便可以調用該Web服務實現內核插件、服務瀏覽以及插件啟動、停止、卸載和安裝操作,方便插件程序的 調試(如原理圖的箭頭2、3所示)。
iOpenWorks開放工廠平臺主要由插件倉庫和插件倉庫OpenAPI組成。插件倉庫實現插件的版本管理、OSGi.NET內核文件版本管理、SDK及客戶端 管理,而插件倉庫OpenAPI則向外暴露了插件及其版本信息、內核文件及其版本信息從而為客戶端提供內核及插件的自動升級支持。
OSGi.NET插件SDK由開發者安裝,向開發者提供了OSGi.NET插件框架、OSGi.NET Web擴展、iOpenWorks啟動程序這三個開發程序集,此外,還提供了插件項目模板、 遠程管理控制臺(用于調試用,可以查看OSGi.NET內核情況)、文檔、示例。開發者使用OSGi.NET插件SDK的項目模板來創建WinForm或者Web插件 應用程序時,這個模板默認實現了:
- 調用iOpenWorks啟動程序程序集來檢查內核文件版本并執行更新;
- 創建插件運行時BundleRuntime 并運行,從而啟動插件內核,默認從Plugins目錄加載插件;
- 高級模板默認包含了頁面流服務插件、應用中心插件、插件管理服務插件、 遠程管理服務插件、WebService包裝器服務插件(插件自動升級插件沒有在模板中包含,可以從插件倉庫中下載)。
4. 插件相關內容
4.1 插件
在OSGi.NET插件框架中,插件是一個具備物理隔離性、完全重用的功能模塊。在這里“插件=Manifest.xml + 類 + 資源”,Manifest.xml是插件的描述文件,位于插件目錄的根目錄下;類即插件的類型空間,由插件自身的程序集和依賴的插件/依賴的程序集組成,資源類似與類,由插件本身的資源和依賴的資源組成。
4.2 插件目錄
插件由Manifest.xml插件清單文件、程序集、資源組成,程序集和資源位于插件根目錄或者子目錄下。其標準目錄結構如下。
4.3 插件類加載
在OSGi.NET插件框架中,插件擁有獨立的目錄結構,具備物理隔離性。相應地,每一個插件有獨立的類型空間,這個類型空間由插件程序集、插件依賴的程序集、片段插件程序集和片段插件依賴的程序集組成。插件的類型是由插件類加載器來加載的。
當你在插件中使用一個類型創建一個對象時,比如MyClassInBundle myClass = new MyClassInBundle(),插件類加載器會按照上面的順序搜索需要加載的MyClassInBundle類型。與此同時,你也可以通過調用插件對象的LoadClass方法(IBundle.LoadClass)從插件類型空間中動態加載一個類型
4.4 插件生命周期
在OSGi.NET插件框架中,插件具有生命周期。插件生命周期狀態有:Installed、Resolved、Active、Uninstalled四個可見狀態和Starting、Stopping兩個臨時狀態。其中,Installed表示插件已經安裝;Resolved表示插件依賴的程序集或者依賴的插件已經滿足,這個插件可以被正常啟動;Active則表示插件已經被成功啟動;Uninstalled表示插件已經被卸載。Starting是一個過渡狀態,當啟動插件時,如果插件使用了晚激活策略,則插件在注冊擴展信息、服務信息之后,直接返回,不會執行激活器的Start方法,這個方法會推遲到第一次從這個插件加載類型時調用并進入Active狀態;反之,如果沒有使用晚激活策略,插件會調用激活器Start方法并進入Active狀態。在啟動過程,如果出現異常,則插件會自動轉回Resolved狀態。Stopping是另一個臨時狀態,在停止插件時,首先進入該狀態,然后調用激活器的Stop方法后進入Resolved狀態。
4.5 插件運行時和插件啟動過程
插件框架啟動時,首先從插件目錄中發現并加載所有的插件;然后,對插件進行依賴解析,判斷插件依賴的程序集和依賴的插件是否滿足;接著,按照啟動級別順序啟動所需的插件;一旦插件啟動完成,則插件框架便完成啟動。
在插件啟動過程中,將按照創建插件上下文、注冊擴展點/擴展信息、注冊服務信息、創建插件激活器并調用Start方法的順序完成一個插件的啟動過程。如果插件實現的晚激活,則推遲最后一步的執行,直到第一次從插件加載類型;如果插件沒有定義激活器,則忽略最后一步。
5. 插件相關對象
5.1 插件運行時BundleRuntime
插件運行時BundleRuntime代表插件框架內核對象,它是所有插件的運行容器。 在示例中,控制臺主程序在Program的Main函數中,通過創建BundleRuntime對象并調用其 Start方法來啟動插件框架內核。當Start方法調用完成后,BundleRuntime對象將從插件目 錄中加載插件并啟動插件。
5.2 插件
插件也稱為Bundle,從OSGi.NET規范上講,“插件=Manifest.xml + 類 + 資源”。其中, Manifest.xml即插件清單文件,用于描述插件的基本信息、類型信息和擴展信息; 插件具備隔離的類型空間,由插件本身的程序集和依賴的插件的程序集組成; 插件擁有自己的資源,存放在私有的文件夾。
在定義一個插件時,您只需要關注三個非常重要的接口,分別是:插件激活器IBundleActivator、 插件IBundle和插件上下文IBundleContext。其中,插件激活器由開發人員自己定義;而插件IBundle和插件上下文IBundleContext則由插件內核創建, 你可以在插件激活器獲取中獲取到這兩個對象
5.3 插件清單Mainfest.xml
插件清單文件(Manifest.xml)位于模塊標準目錄結構的根目錄之下,它定義了模塊的基本信息、模塊激活信息、模塊類加載相關的運行時信息、服務定義信息、模塊擴展定義信息以及模塊詳細信息。
以上清單文件定義了該模塊的一個本地程序集“bin\ShellPlugin.dll”,該程序集位置相對于模塊的根目錄,當然,你也可以指定一個絕對目錄。模塊還定義了一個激活器和擴展點。
5.3 IBundleActivator
IBundleActivator表示插件激活器,是插件的入口和出口,用于在插件啟動或停止時執行相關操作。
插件激活器通過Manifest.xml的Activator節點配置,當插件被啟動時插件激活器的Start方法被調用, 當停止時Stop方法被調用。
在插件激活器的Start/Stop方法的context參數,即插件上下文IBundleContext對象,通過IBundleContext 您還可以獲取對應的插件IBundle實例。
5.4 IBundle
IBundle表示由內核創建的一個插件,一般而言,“Bundle=Manifest.xml + 類 + 資源”。 插件對象向您暴露了以下功能:
- 類型加載。
- 資源加載。
- 插件生命周期操作。
5.5 IBundleContext
IBundleContext表示插件上下文,實現了對插件框架的反射,通過模塊激活器IBundleActivator的 Start/Stop方法的參數獲取該對象。 插件上下文向您暴露了以下功能:
- 獲取對應的插件實例。
- 對插件執行生命周期操作,安裝其它插件。
- 插件倉庫查詢。
- 服務注冊與綁定。
- 獲取本插件的擴展點和擴展。
- 監聽框架事件、服務事件、插件事件和擴展事件。
UIOSP 官網:http://www.iopenworks.com/
OSGI.NET 官網:http://osgi.codeplex.com/
參考資料:http://www.cnblogs.com/zhaojudi/archive/2013/02/26/2933788.html
http://www.cnblogs.com/shalahu/archive/2013/02/21/2921306.html
示例源碼: http://osgi.codeplex.com/SourceControl/latest
文章列表