OSGi.NET 學習筆記 [模塊化和插件化][實例]


Demo 點擊下載

目錄】-【模塊化和插件化】-【實例】


  假設我們准備做一個計算器,是的,先從最簡單的加減乘除開始。
  1) 先確定一下是命令行顯示,.NET 4.5,C#,VS 2012的開發環境;
  2) 第一階段實現加減乘除功能,用戶輸入計算公式,回車,返回計算結果;
  3) 其他問題待定。


  OK,先來分析一下如何做。
  1) 邏輯上,簡單來說,核心在計算,一種輸入,計算和輸出的過程。
  2) 其他的就是界面和異常了。


  稍微具體點,
  1) 設計一個接口ICalculate,有返回類型為string的方法Calculate,一個string類型的參數,計算公式。
  2) 一個具體的實現類,繼承ICalculate,通過一個DataTable().Compute來直接運算計算公式並返回結果。
  3) 當然有個具體的命令行程序來執行計算公式輸入,並調用接口的方法和在界面上輸出。


  分析道這里,應該和普通的開發過程大致是一致的,邏輯封裝,但對OSGi來說還不夠,接下來我們得看看如何物理封裝隔離。
  1) 對現在的主程序來說,可能變化的有兩個模塊,一個是接口,一個是接口的實現。但為了后面的SOA的介紹,我們暫且將接口和接口的實現放在一起,作為單獨的一個模塊來做物理隔離。


  但在真正開始編碼之前,我們需要先簡單了解一下OSGi.NET的“模塊管理機制”,就是他如何來識別、解析、加載、卸載某個具體模塊的。
  1) 首先是OSGi.NET的運行時環境,或者叫插件運行時,他是插件的運行容器,由他來管理所有插件的“生命”,這有點兒像是主板的BIOS,可以啟動停止某些組件,比如關閉板載聲卡。
  2) 接下來是“生命周期管理”,對於每個模塊,在運行時環境里都處在某個特定的狀態,默認模塊的狀態是由運行時來管理的,但通過一定的API調用,我們也可以改變它。理想的狀態切換順序是Installed、Resolved、Starting、Active、Stopping、Uninstalled。其中Resolved可能不太好理解,他其實就是BIOS的“自檢”過程,如果模塊依賴解析失敗就會“Beep報警”。
  3) 還有“依賴解析”,前面說過最理想的狀況下,所有模塊應該是邏輯和物理都獨立的,應該是自依賴,不應該依賴其他任何模塊。可實際情況是,大部分時候,我們都必須去依賴。就像現在的主板,板載聲卡一般是需要依賴CPU甚至GPU去計算的,就是說一個模塊的功能可能依賴另一個模塊提供的服務。所以依賴解析就顯得非常重要了,他確保了模塊之間的依賴關系在當前運行時環境是確實存在的。
  4) 理解這些后,我們來大致推演一下一個模塊幾個重要的“生命誕生和結束”過程
    a) OSGi.NET運行時啟動
    b) 遍歷指定路徑下所有模塊的Manifest.xml文件,得到所有程序集路徑和依賴模塊等信息
    c) 依賴解析,成功繼續,失敗停止
    d) 開始啟動
    e) 啟動成功
    f) 開始停止
    g) 卸載成功
  5) 以上的過程我們可以參與最多的就是開始啟動和開始結束,用於前期初始化工作和后期清理掃尾,相當於模塊的入口點和出口點,OSGi.NET稱之為“激活器”,具體的位置可以在Manifest中定義。
  6) 當然啟動時,除了入口點之外,運行時環境啟動模塊時還為我們做了很多准備工作,比如創建上下文,讓其他模塊可以訪問我們的模塊,注冊擴展點和擴展,注冊服務等等。
  好了,理解完這些,就差不多可以開始動手了,看代碼的時候如果有疑問,可以再過來對照參詳。

  1) 我們直接使用SDK提供的模板來創建一個“控制台主應用程序”,這里所謂的“主應用”就是啟動OSGi運行時環境的入口程序,和普通的.NET無太大區別。
  


  2) 創建完成后,我們來看看他的目錄結構
  
    a) “引用”中包含了最核心的UIShell.OSGi
    b) bin\plugins是默認的OSGi.NET查詢路徑,且此目錄下已經有了兩個默認模塊,用於和“遠程管理工具”交互。
    c) Main函數是程序入口點,在Program.cs文件中,我們可以看到他的主要工作就是啟動OSGi.NET運行時環境,BundleRuntime。
    


  3) 點擊F5可以將它運行起來,當然沒有任何邏輯處理,只是輸出默認結果
  


  4) 我們在點擊桌面的“遠程管理工具”,輸入兩個回車,取它的默認值
  
    a) 輸入list或l,目前將只返回以下結果
    
    b) 關於各個值的列的意思和其他命令工具,我們稍后會加以詳解。


  5) 好了,先將遠程管理工具放在一邊,我們繼續我們的編程工作。繼續通過模板創建一個“控制台插件”,這個“插件”就是一個模塊,也就是OSGi叫的Bundle。需要特別注意的是,這個插件的創建路徑必須在bin\plugins目錄下,否則無法被主應用程序識別和加載。
  


  6) 我們繼續看看這個插件的目錄結構
  
    a) “引用”包含了UIShell.OSGi
    b) 這個插件沒有入口程序Main,但有一個“激活器”,Activator和它的兩個方法Start和Stop,如前面提到的,這就是這個插件的“入口”和“出口”,而這個信息是在Manifest.xml配置指明的,雙擊Manifest.xml來看看,激活器的值正是Calculator.Demo1.Activator。
    
    c) 默認的激活器是什么都不做的,為了顯示效果,我們可以讓它主動式輸出一些信息,例如
    
    d) 編譯整個工程,點擊F5,來看看效果
    
    e) 切換到“遠程管理工具”,再次輸入l,結果如下
    
    f) 現在在我們Debug的程序中點擊回車,理論上,一閃而過,你應該看到如下結果
    
    g) 嗯,到目前為止,一切都OK!推薦再回到前面看看一個模塊幾個重要的“生命誕生和結束”過程。


  7) 好了,大致跑通了,我們開始真正的實現業務邏輯了,首先在主程序中添加ICalculate接口,並在插件中實現它。具體代碼就不貼了,可以自己查看源碼。


  8) 來看看主程序如何調用具體的實現的
  


  9) 運行結果示例
  


  10) OK,雖然比較弱,但差不多能用了。下一步就是結合更多OSGi.NET特性來優化它了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM