SailingEase WinForm Framework WinForm開發框架開發手冊:http://docs.shengxunwei.com/Home/Browser/sewinformfw/
本系統文章將詳細闡述客戶端應用程序的設計理念,實現方法。
本系列文章以 SailingEase WinForm Framework 為基礎進行設計並實現,但其中的設計理念及方法,亦適用於任何類型的客戶端應用程序的設計與開發。
目錄:
http://www.cnblogs.com/sheng_chao/p/6084144.html
前言:
可能是接觸計算機比較早,從96年左右386開始,到 Trubo C,以及后來的Foxpro、VB、Delphi,一直以來似乎都有一種客戶端程序情節,喜歡寫客戶端程序。
在 .Net 出現以后,投入了許多時間在研究 .Net 編程上,在客戶端領域早年基本以 WinForm 為主,近幾年逐漸轉向了 WPF。
除了日常工作中的項目開發,業余時間使用 WinForm 寫過許多東西,比較成型的大概有兩個
1)SailingEase WinForm Designer IDE (2007~2010 暫停開發)
http://www.cnblogs.com/sheng_chao/p/4387249.html
高度實現的 IDE 開發環境,完整實現了 WinForm Designer,可通過可視化配置的方法,定義界面和業務邏輯,並使用 XML 進行描述。
這個項目一開始的設想,心很大,企圖做一個讓不懂編程的人,也能拖拖畫畫加上配置,來生成企業所需的管理軟件。投入了大概兩年多的業余時間,這期間應該是我自己開發能力和設計能力增漲最快的時期,開始做這個項目的時候,有太多的問題超出能力范圍,只好到處找書看、找資料學習。在每天回家的路上看完了《設計模式》,平時的碎片時間看完了《代碼大全2》,另外閱讀了 SharpDevelop 的許多源代碼,也有一部分的實現是參考了它的思路和代碼。
2010年左右由於時間和精力有限,加上對於軟件項目有了一些新的認識和想法,這個項目就暫停至今。其它幾個小規模的 WinForm 項目,和本系列文章的主角:SailingEase WinForm Framework,均脫胎於此項目。
2)SailingEase .NET Resources Tool
http://www.cnblogs.com/sheng_chao/p/5958846.html
一款輔助多國語言軟件開發的實用工具,目的在於通過生成接口來約束不同語言資源的實現,使開發人員可以基於接口調用資源。 此外,提供方便開發人員使用的各種實用功能,如多項目並行編輯,資源導入,Excel 導入、導出等。
這個項目源自於上面的 IDE 項目,由於做 IDE 時心太大,希望能夠支持多國語言,但是慢慢發現從工程角度來說,這是一件非常麻煩,容易不可控的事情。就花了結時間,想了一個辦法,用接口來約束不同的資源。
最后祭出本系列文章的主角:SailingEase WinForm Framework。
其實這是從 IDE 項目中提取出來的一個純開發框架,它沒有用戶管理、權限管理之類的現成功能,而是提供純開發角度的開發框架,概括來說提供了以下幾方面的功能:
a.宿主程序(殼)與功能模塊(插件)的加載、調度、通信等實現;
b.不同插件之間在完全接耦合的基礎上,同步/異步調用、狀態響應等機制的實現;
c.插件之間在代碼層面完全沒有互相引用關系,可以實現在缺少任意插件的情況下啟動應用,即使他們在UI層有交集;
d.支持模塊間的依存關系定義;
d.事件聚合器,用於在完全解耦的條件下,發布及訂閱事件;
d.宿主程序提供了統一的主菜單及右鍵菜單的注冊/吊銷/狀態控制機制;
e.宿主程序提供了統一的窗口調度/加載/銷毀功能;
f.宿主程序提供了統一的日志記錄、異常捕獲,Web頁面互操作等功能;
g.基於 GDI+ 自行實現的控件包,提供了高度的可擴展性;
h.基於zip格式的文件包管理器(基於zip的自定義文件格式,讀取或寫入指定的流);
i.對http、xml、磁盤io、反射、加解密等操作的增強與封裝;
j.其它……
第一章節:客戶端軟件的架構設計概述
本章節將概述基於 SailingEase Winform Framework 框架的客戶端應用程序的架構設計。
時常有朋友或者客戶會問:“你這個軟件是不是三層架構設計”。
實際上客戶端軟件的架構並不是這么划分設計的,也遠遠比所謂的三層架構要復雜的多,與 Web 程序在不同的頁面間無狀態跳轉不同,客戶端程序更加成一個整體,單頁面 Web 應用有一些方面與之類似,不過亦有許多不同。
我們通過一個簡單的設計圖初步了解基於 SailingEase Winform Framework 的客戶端程序架構:
SailingEase WinForm Framework 的核心,就是模塊化。
基於 SailingEase WinForm Framework 框架的應用程序由運行時動態加載的松散耦合模塊組成,模塊包含代表系統不同功能的可視和非可視組件,可視組件(視圖)被組合在一個外殼中(主窗口)。
宿主程序提供各種基礎服務,並將這些模塊級組件結合在一起;模塊也可以提供與應用程序的特定功能相關的其他服務。
SailingEase Winform Framework 是“復合視圖”設計模式的實現,此模式支持包含子項的視圖遞歸結構。這些子項本身也是視圖,這些視圖通過某種機制組合起來(在運行時動態組合而非設計時靜態組合)。
模塊永遠不會相互直接引用,也不會直接引用宿主。它們會利用服務、事件聚合等機制在彼此之間以及宿主之間進行通信,並響應用戶操作。
使用模塊來組成系統有很多好處。模塊可聚合來自同一應用程序中不同后端系統的數據。此外,系統可隨着時間的推移更加方便地發展演變。在系統需求發生變化而需要向系統中添加新模塊時,與非模塊化系統相比,模塊化系統面臨的沖突要少很多。而且還可以對現有模塊進行獨立性更強的改進,從而改善可測試性。
模塊可由不同的團隊開發、測試和維護。在小團隊開發維護模塊時,也不必加載編譯整個應用程序解決方案,只需建立一個包含宿主和指定模塊的精簡解決方案即可。
在 SailingEase Winform Framework 中,可定義不同模塊間的動態依存關系,有時一個完整的業務操作需要不同模塊間協作完成,而其中有些環節不是必須的,此時我們可在缺失部分模塊的情況下,正常執行完整個業務流程:
主動模式:
主動模式使用建造者模式進行實現,由業務或操作的發起模塊主動控制流程,由其自身判斷需要響應的模塊和模塊是否存在。
被動模式:
被動模式使用事件聚合器進行實現,業務或操作的發起模塊完成自身操作后,向事件聚合器發送通知,在事件聚合器中注冊過的模塊會收到相應的通知和數據,從而響應業務操作,響應事件聚合器的不同模塊可使用多線程技術並發處理。
在被動模式中,事件的發布模塊,完全不關心有哪些模塊會響應事件,也不關心事件的響應結果。對於響應事件的模塊來說,它們也不關心事件是由誰發布的,只需處理好相應的業務即可。
視圖級別的動態依存:
舉例來說,當我在用戶信息模塊中的用戶列表畫面中選擇用戶時,畫面底部需要顯示用戶最近一筆訂單,而這個訂單信息區域(View),需要由訂單模塊提供,但是當訂單模塊不存在,或沒有加載時,用戶畫面依然可以正常顯示及使用,只是顯示訂單信息的位置,被隱藏了。
當用戶模塊和訂單模塊同時存在時:
選中用戶列表中的用戶,則在畫面下方自動顯示其最近訂單。
顯然用戶模塊與訂單模塊不僅有視圖層面的融合,還有操作響應上的融合,而這些融合與調用,在 SailingEase Winform Framework 中是完全解耦合的,兩個模塊之間不存在任何互相引用關系。
當訂單模塊不存在或沒有加載時,用戶模塊中的畫面將自動調整,UI操作不會有任何影響:
模塊化只是基礎,除了模塊化之外,作為宿主程序,通常會提供一系列的基本功能實現。
其中特別重要的有幾點:主菜單/右鍵菜單/工具欄的融合與調度,窗口調度器、線程調度器、服務容器、事件聚合等等,我將在后續的文章中詳細闡述。
一個典型的基於 SailingEase Winform Framework 的應用程序架構
以 SailingEase WinForm Designer IDE 為例:
運行時效果:
在下一章節中,我將對客戶端應用程序的架構作更進一步的闡述,並詳細說明基於 SailingEase Winform Framework 的模塊化開發如何實現。
歡迎加我QQ交流探討,共同學習:279060597,另外我在南京,有南京的朋友嗎?