文章目錄
- 1. 外掛程式式管理容器
- 2. 可自動組裝的演算法組合器
- 3. 調試輸出
- 4. 資料庫和資料服務
- 2. 可自動換膚的介面系統
- 3. 關係型資料視覺效果控制項
- 4. 統計型圖表控制項
- 5. 地理控制項
- 1. 反射加速特性
- 2. 自組裝菜單
- 3. 網路通訊庫
- 4. 序列化,.NET Remoting等
一. 綜述
工欲善其事,必先利其器。器可以來自他人,也可以自造。我進實驗室的第一個項目便是開發一款行業軟體,相比於真正的商業軟體,它的系統本身真的很簡單。但真是應了那句話,“大學不適合做軟體”,整個系統互動複雜,設計冗餘,維護起來很困難。在項目結題之後,整個系統便存在硬碟裡再也沒有人問津。雖然我只開發了其中一個模組,但依舊心痛。
痛定思痛,我希望能有一個成熟簡單的案頭架構,解決多數案頭開發遇到的問題:介面顯示,資料庫,外掛程式式架構,調試輸出,網路連接等。同時儘可能減少多個開發人員之間的耦合度,為此我瞭解了SharpDevelop等開源軟體,但它的設計對我而言依舊太複雜了。更強調的是代碼複用,為一個項目開發的模組,為何不能為另外一個專案服務,同時儘可能減小整合的工作量?於是,從研一上學期開始,我便投入了第一個外掛程式式案頭架構類庫的開發: XFrmWork 。
如今,它作為基礎類庫為三個項目軟體提供服務,分別是XMOVE,實驗室的資料採礦軟體和LTE軟基站模擬示範程式。
下面是以XFrmWork為基礎實現的軟體之一——XMOVE Studio:
下面,本文集將簡要介紹其功能和實現。
二. 基本結構
XFrmWork基於WPF介面技術和.NET Framework 4.0。 外掛程式式結構設計。主架構套件含五個類庫,其名稱和功能如所示:
絕大多數的UI控制項採用了MVVM結構,利用資料繫結實現介面與邏輯分離。所有使用外部開原始檔控制的都對其做了介面抽象,因此可以在任何時候使用其他同功能控制項,上層代碼不需做更改。
同時,架構正在增加其他類庫,其中包括專門實現多媒體功能的XFrmWork.MultiMedia庫,由於其並未開發完成,因此此處沒有介紹。
三. 系統特性介紹——準系統 1. 外掛程式式管理容器
為了儘可能的減少組件整合的工作量,系統採用了類似外掛程式樹的設計方案。所有的功能都通過可組裝的外掛程式接入系統。使用非常方便,只需在對應的類上添加attribute標識。
外掛程式的結構類似於索引值對:鍵(Key)是外掛程式要求實現的介面,值是對應的外掛程式名稱字典。管理器可以隨時插入,刪除(有安全隱患)外掛程式字典中的資料。至於外掛程式系統的具體實現,可參考我的系列博文。
以下是外掛程式系統搜尋相關目錄下的外掛程式後形成的外掛程式列表:
您可以詳細瞭解到當前系統所有的外掛程式字典的鍵(的“外掛程式介面列表”)和 值,同時給出外掛程式的載入策略和詳細資料。
2. 可自動組裝的演算法組合器
在科研計算領域,通常面臨的問題是複雜多樣的,因此很難通過圖形介面完成配置和操作。但我借鑒了Labview的理念,任何複雜演算法總可以分解為不同的模組的組裝。因此,我們只需設計不同的演算法模組,並定義它們的介面。使用者可以根據問題的不同,對模組實現組裝和配置,解決實際中的複雜問題。
模組可以理解是擁有輸入輸出介面的“盒子”,一個盒子可能包含多個輸入或多個輸出。只有輸入全部滿足,才能執行,但可以不輸出給其他盒子。多個盒子可以以複雜的形式組裝為演算法網路,實現自動化處理。同時,不同的演算法之間可能存在耦合和分層。演算法管理系統將對模組實現分層和分組。不同組之間模組無互動,因此可以並存執行。同組演算法由第一層依次執行到下層,類似流水線。我在這篇博文中,詳細介紹了它的實現:
如,資料統計輸出模組和時間序列分析是分在一組,但不同層的模組,處理時先執行資料統計輸出,並將其結果傳輸到時間序列分析。 另外一組, 計算方法A和B都是C的輸入,運行時先完成A,B的處理(並行完成),當兩個任務都完成時,傳遞給計算方法C,繼續執行。 值得注意的是,不同組之間是並行的,他們的執行互不干擾。
3. 調試輸出
良好的調試可以方便開發人員和使用者,通常我們採用VS內建的調試工具,但在軟體Release之後,需要有介面輸出工具。
調試輸出組件我採用了log4.net組件,網上相關資料較多,此處不贅述。以下是實現效果:
值得一提的是,該組件可以按照資訊等級的不同(Debug,Info或是Error等)顯示不同的顏色,以提示使用者。這些資料可以方便的儲存為檔案,或傳輸給指定的電子郵箱地址。
4. 資料庫和資料服務
資料作為軟體系統的核心,作者開發了多項資料相關模組
from data in 基本資料1where 性別 is fselect data
點擊尋找,系統就會自動解析LINQ語句,並執行尋找功能。
四. 系統特性介紹——圖形與可視化
1. 基於AvalonDock的類VS介面布局系統
複雜軟體一般需要可自訂的布局系統,本架構使用了AvalonDock開源軟體的WPF版本,可以隨時修改布局,拖放任意組件,支援不同解析度,甚至顯示在不同的顯示器上。同時,系統可以儲存或載入已經儲存的布局。
2. 可自動換膚的介面系統
WPF的動態資源使得原本在winform時代幾乎不可能實現的“動態換膚”成為可能。您可以選擇軟體右上方的主旨管理員選單,選擇不同風格的介面效果。
3. 關係型資料視覺效果控制項
在資料採礦子項目中,需要動態顯示和分析資料間的聯絡,因此我設計了專門顯示關係資料的可視化控制項,具備如下功能:
- 可動態定義關係點樣式和線樣式,可通過xaml或C#代碼定義,系統在運行時反射獲得。
- 可實現2D,3D效果
- 使用者可搜尋,定位,放大和拖拽不同點和畫布,並對畫布進行放縮
- 布點演算法支援隨機撒點,FDA(力導引)等多種演算法,並在不斷擴充中
- 布點可實現動態顯示,呈現網路形成過程。
展示了微博使用者網路(採用星狀布點)
4. 統計型圖表控制項
為了方便顯示統計資料,我使用了開源圖表控制項WPFWisifire。同時,採用了介面隔離方式簡化了控制項實現,使用時僅需要傳遞一組KeyValuePair序列,即可實現繪圖。支援柱狀,線狀,雷達等類型圖表。展示了中國登記在案的科研項目每年數量的變化圖:
5. 地理控制項
地理圖形可以更直觀的協助使用者分析資料,因此我使用了開原始檔控制GMap.Net實現地圖功能。同樣使用介面隔離具體實現,可自動定位,繪製路徑,增刪修改地標等。
五. 其他特性和功能 1. 反射加速特性
為實現更好的擴充性,作者在程式中大量使用反射,為提速,作者使用了一些技術提升反射效能,從而最佳化了使用者體驗。
2. 自組裝菜單
系統上方的菜單也是根據外掛程式介面自動組裝完成的,如所示:
3. 網路通訊庫
作者通過重新封裝socket等基礎功能,提供了方便上層調用的通訊功能。
4. 序列化,.NET Remoting等
作者使用了多項技術,使得上層不需要考慮資料存放區的序列化細節,只需調用一個函數即可完成。而對於跨進程調用時,系統使用了.NET Remoting等技術。在此不一一贅述。
六. 總結
XFrmWork是我在.NET開發中實現的第一個完整類庫集。坦白的說,部落格園裡的諸位大神,早已使用或已經開發了比XFrmWork強得多的架構系統。但是它卻是適合我自身的系統。在不同項目的需求驅動下,我的團隊推動了它的不斷升級。這也讓我學到了更多的知識。我會為其外掛程式搜尋速度絞盡腦汁,也會吸收各類開源軟體的架構精華。其實,有這樣的平台,對我來說已經足夠。如果它能被我帶入到工作中,那一定是最幸福的事情。
開放全部的原始碼沒有價值,我會在“外掛程式系統載入”和“自組裝模組"的基礎上繼續與大家分享它的開發經驗。歡迎大家關注。