一. 綜述
工欲善其事,必先利其器。器可以來自他人,也可以自造。我進實驗室的第一個項目便是開發一款行業軟件,相比於真正的商業軟件,它的系統本身真的很簡單。但真是應了那句話,“大學不適合做軟件”,整個系統交互復雜,設計冗余,維護起來很困難。在項目結題之后,整個系統便存在硬盤里再也沒有人問津。雖然我只開發了其中一個模塊,但依舊心痛。
痛定思痛,我希望能有一個成熟簡單的桌面框架,解決多數桌面開發遇到的問題:界面顯示,數據庫,插件式架構,調試輸出,網絡連接等。同時盡可能減少多個開發者之間的耦合度,為此我了解了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. 數據庫和數據服務
數據作為軟件系統的核心,作者開發了多項數據相關模塊
- 數據庫抽象層(抽象數據庫具體實現),使得未來可升級其他數據庫而不更改上層代碼
- 數據庫管理器:可方便連接,顯示,導入,存儲數據庫數據:
-
數據查看器:為方便數據開發,采用數據綁定和反射技術實現數據查看。其界面會隨數據類型的不同而動態改變。
- 動態查詢:作者學習整合了一些開源組件的設計思想,用戶可在通過LINQ, 在數據集中實現自定義查找。例如,查找數據集”基本信息1“中性別為女的數據集可采用如下寫法:
from data in 基本數據1 where 性別 is f select 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強得多的架構系統。但是它卻是適合我自身的系統。在不同項目的需求驅動下,我的團隊推動了它的不斷升級。這也讓我學到了更多的知識。我會為其插件搜索速度絞盡腦汁,也會吸收各類開源軟件的架構精華。其實,有這樣的平台,對我來說已經足夠。如果它能被我帶入到工作中,那一定是最幸福的事情。
開放全部的源代碼沒有價值,我會在“插件系統加載”和“自組裝模塊"的基礎上繼續與大家分享它的開發經驗。歡迎大家關注。