傳統Winform系統的轉小程序化設想
大型企業往往有一個或幾個核心系統, 為了保證核心系統的穩定, 很少直接在核心系統內部添加新功能, 而是采用外掛形式增加新功能. 在傳統企業內部, 這些外掛系統往往是一些Windows桌面系統, 這些外掛系統從源碼角度看, 都很類似, 有著相同的用戶登錄驗證, 相同的權限管控方式,相同的后臺數據庫, 但因為各種原因, 它們并沒沒有被很好地規劃, 比如缺少統一的UI設計,邏輯類似但項目代碼沒有被很好的組織, 相同的代碼不斷地被復制粘貼, 維護成本越來越高.
這里給出一個解決方案: 建立桌面版的小程序體系, 示意圖見下.
原先是在核心系統中直接打開某個外掛系統, 將來轉變為先打開小程序容器程序, 并由小程序容器動態加載這個外掛模塊.

改造內容:
1. 把各個外掛系統通用功能移到小程序容器系統中, 比如登錄和權限驗證等.
2.將外掛系統退化成外掛功能模塊, 為了減少改造成本, 這些外掛模塊仍以C#項目形式存在, 只是轉換成dll類庫系統. 備注:C#的dll項目是可以包含Form窗體的.
改造收益:
1. 統一了UI風格, 更好的使用體驗.
2.將多個源碼solution合并到一個源碼solution中, 代碼復用性會更好, 源碼管理成本會大大降低,將來功能升級也更容易.
實現方式:
采用著名的開源WinForm控件 DockPanelSuite, 使用DockPanel作為外掛模塊的容器, 改造難度非常小. 下面簡單介紹具體做法.
外掛項目:
⒈外掛項目轉成dll類庫項目形態, 其實也可以是獨立的Exe程序, 但如果是Exe的化, 容易繞過容器程序.
2. 外掛項目增加Dock panel suite 引用
3. 對于外掛項目主界面或需要被核心系統直接調出的界面, 將其基類從 Form 轉成 DockPanelSuite 中的 DockContent 類, DockContent 類其實也是 Form 類的子類, 最好是定制化一個統一的 DockContent 類, 比如 DockableForm, 統一所有外掛模塊的樣式.
4. 下面是 DockContent 類的一些擴展屬性和方法
(1) AllowEndUserDocking 屬性: 是否允許最終用戶調整 Dock 方式
(2) AllowEndUserNestedDocking 屬性: 是否允許最終用戶來嵌套Dock
(3) TabText 屬性 : 設置 Tab 頁簽的 header 文本
(4) DockAreas 屬性: 子窗體可以被dock到的位置, 比如 上/下/左/右等
(5) HideOnClose 屬性, 設置為 True 時, 關閉子窗體其實僅僅是隱藏
(6) CloseButton, bool 屬性, 是否可以關閉 tab 頁簽
(7) CloseButtonVisible 屬性, pane 上的 close button 是否可見.
(8) DockHandler 屬性, 其實可以將 DockContent 類認為是 Form + DockHandler, 也就是 DockContent 擴展的屬性和方法都是來源于 DockHandler 類
(9) Show() 方法, 通過該方法, 可以將子窗體 dock 到父窗體的 DockPanel 控件上, 可以設置 dock 過去的位置, 上下左右等等.
容器項目:
1. 將主窗體 IsMdiContainer 屬性設置為 true. DockPanelSuite 底層機制和傳統的 MDI 應用類似, 所以 MDI 應用的一些方式, 也適用于dockPanel 容器窗體, 比如 mainForm.MdiChildren, mainForm.ActiveMdiChild 等.
2. 增加一個 dock panel 控件
3. 設置 dockPanel 組件的一些重要屬性
(1) DocumentStyle 屬性,
DockingSdi: 當只有一個頁簽時候, 不顯示該頁簽的header.
DockingMdi, 默認的mdi 模式,
SystemMdi: 不推薦使用, 這種方式下最大程度地模擬傳統的MDI應用, , 很多處理機制和 dockPanel 其他模式不同.
(2) ShowDocumentIcon, 頁簽是否顯示圖標
(3) DocumentTabStripLocation, top/buttom, 頁簽實現在上方還是下方
(4) DocArea, 只讀屬性, 真正用于裝載子窗體的區域, 如果太小, 子窗體可能顯示不全.
(5) Documents 屬性, 所有子窗體的清單.

浙公網安備 33010602011771號