Winform開發的快速、健壯、解耦的幾點建議
- 2021 年 11 月 23 日
- 筆記
- WinForm開發框架
在Winform開發領域開發過十多年的項目中,見證著形形色色的架構和官方技術的應用,從最早類似Winform模式的WebForm技術,到接著的JQuery+介面組件,再到Asp.net Core的技術應用,以及後來的純前端技術出現,Angular、React、Vue等前端技術和語言的廣泛應用,Web應用越來越多,也越來越精細化,從最初的單服務,到單服務+分散式快取,再到微服務集群的各種服務架構,Web開發的體系越來越龐大和複雜化,雖然引入更多先進技術、更多優秀架構,但同時也意味著更高的技術門檻,以及全棧式的開發需求或要求,Winform開發依舊佔領一席之地。本篇隨筆針對Winform開發的技術特點,針對自己多年的開發經驗,對Winform開發的快速、健壯、解耦的一些領域提出幾點微薄建議,拋磚引玉,希望大家多加指正。
1、Winform的技術概括
另一方面,作為Winform的替代者,Silverlight的盛行以及沒落,WPF的逐步應用並重用,以及統一的通用 Windows 平台 (UWP),都充當著Winform的終結者的大任,不過即使應用範圍縮減,Winform依舊很頑強,即使.netcore的大環境下,也依舊保留在Visual Studio 2022中,可見Winform開發的生命力之頑強。
Winform開發對比其他有不少優點,主要的特點還是開發方便,基於一定的框架,可以快速開發特定的業務管理系統。下面就WInform這個技術應用做一個個人的概括。
1)用戶體驗
在Winform應用裡面,和其他Web系統比起來,它的用戶體驗是最好的,而且介面響應速度也比Web介面來的快捷一些,由於很多情況下,用戶考慮使用方便性,如一些報表的展示、列印、導入導出文件的處理等常規的操作,都還是習慣使用Winform這種訂製型非常好的介面來處理,畢竟大多數情況下,單位都有一套業務和數據的管理系統來處理這些業務。
2)數據敏感
另外很多情況下,如一些事業單位、機構什麼,他們的數據是比較敏感的,不希望對外公開,網路的引入會提供數據外泄的可能,另外它們也是經常處於內網的環境下,因此一個單機版的程式就可以搞定他們的日常業務處理了,這種特別的業務環境,註定了使用Winform來處理會更勝一籌。
3)開發便利
Winform開發的程式,發布共享比較容易,直接安裝就可以使用,可以不需要部署在雲端(雖然我的混合框架方式可以訪問Web API、WCF等服務獲取數據,透明的數據處理);而且Winform的介面開發起來非常方便,結合介面套件,可以做出非常棒的介面效果。另外從開發角度上講,Web前端的技術淘汰非常快,Winform的技術積累反而是在逐步加固的過程,因此對於一些開發人員來說,迭代Winform開發的應用會更加方便,也更加熟練,因此只要客戶在用,系統兼容,這種Winform的程式會一直保留下去。
4)應用廣泛
Winform開發的程式,其應用領域真的是覆蓋方方面面,包括常規的資料庫應用,以及Socket套接字的處理,底層硬體串口或者Modbus協議對接,基礎列印、讀卡器、射頻開發、USB、攝影機的控制處理等,可以說Web能做的Winform基本都能做,而Winform能做的Web不一定能做到。
2、如何實現Winform的模組化開發?
對於如何實現Winform應用的模組化開發,其實本身Winform來源於早期Delphi、VB時代,它們已經是在控制項的拖動處理、事件驅動方面都已經完善至極,對一些簡單的應用,拖動一些控制項,再增加一些事件響應處理即可完成主要的功能,這個也是很多早期共享軟體盛行的重要原因。
隨著程式功能的日益複雜化,Winform程式呈現模組化,把一些功能處理、UI介面等按照橫向或者豎向劃分,進行介面性、功能性的不同程度的分離,如出現了很多介面組件,如ActiveSkin/Skin++、DotNetBar、DevExpress等等,它們負責介面的渲染和簡單的功能響應,對於業務性的介面則只能由開發者完成處理,但是已經實現一定程度的橫向功能分離了。
通過利用這些UI組件,使得我們的Winform介面更加豐富,就像穿上了很高貴的服飾,面目一新,不過它還是不能解決程式複雜度的問題,有時候因為介面特性的原因,可能引入更多的複雜性難題,提供更多更精細難懂的事件來處理。
在我們開發一個應用的時候,往往需要集成一些應用場景,如基礎的用戶、角色、機構、許可權、日誌等許可權管理系統,以及字典參考,附件管理等內容,以及一些封裝好的分頁處理控制項,公用類庫等支援類庫等。
因此我們在這個基礎上開發Winform項目,會更加高效快速。
Winform開發的相關業務邏輯(包括介面UI),都可以封裝在一個簡單的DLL文件中,需要的時候進行引用和調用即可,使用起來非常方便,這種方便也使得Winform程式的模組化更加簡單和高效。
通過在解決方案中引入相關開發好的模組,直接調用使用即可,非常快速簡單。
開發程式模組,除了一些業務模組外,大多數都是類似拼積木的方式,把它們在主介面中引入即可。
而Winform模組的調用,只需要簡單的調用或者帶入相關參數即可。
我們Winform框架通過多年積累,也提供了很多基礎的模組來給我們新業務開發提供便利,如公用類庫、分頁控制項、字典管理、許可權管理系統、自動升級、附件管理、人員管理、工作流管理等可以反覆重用的模組。
有了這些模組的加持,我們開發項目很多基礎的處理就不用所有的東西都從頭來過。
軟體和建築工程很類似,都是需要構建一個龐大而功能完整的一個系統,而工程化也意味著需要多人協作,那麼就需要把一個龐大的系統橫向或者縱向劃分為各個可以獨立施工完成的模組,雖然各個模組之間有所銜接或者交互,但是基本上可以以模組化的方式來構建,這個也是工程化開發的精髓所在。
以一個軟體管理系統為例,我們儘可能把精力焦點放在客戶的業務需求上,而對於常規的如許可權控制、字典管理等一些常用的內容,由於它們的處理邏輯在特定領域上基本上比較固定一些,可以儘可能獨立並重複使用。
3、如何實現Winform應用的解耦開發?
隨著應用模組的複雜化,獨立化,這個解耦的問題就是所有場景開發的共同問題,因此三板斧的操作大多數類似,雖然Winform特點又有所不同。
以資料庫應用支援為例,對於不同模組的應用,可能需要同時支援不同資料庫,通過配置實現切換不同資料庫的調用。
因此在開發模組的時候,我們需要先定義統一的資料庫處理介面,然後為不同類型的資料庫訪問做一個獨立的實現處理。
在實際需求中,你往往不能決定客戶需要用什麼資料庫,那麼需要根據實際需求或者環境進行資料庫類型的選型,如果是單機版為了方便可以使用SQLite,如果是已有業務系統或者需要響應速度快一些的,那麼考慮使用SQLServer或者Mysql、有些歷史原因的可能會用PostgreSQL或者Oracle等等。那麼框架的彈性就需要支援多種資料庫的了,這種支援不能導致太大的工作量最好,否則會弄得焦頭爛額的。
框架底層資料庫訪問採用了微軟企業庫實現,因此在處理多種資料庫訪問的時候,能夠提供統一的訪問處理操作,同時對不同的資料庫支援操作也是非常不錯的。下圖是框架底層資料庫的支援情況。
採用不同的資料庫,我們需要為不同資料庫的訪問層進行生成處理,如為SQLServer數據的表生成相關的數據訪問層DALSQL,裡面放置各個表對象的內容,不過由於採用了相關的繼承類處理和基於資料庫的程式碼生成,需要調整的程式碼很少。
而對於更高一級的應用數據來源,有可能來源於Web API,也有可能來源於資料庫,也可能來源於WCF服務等方式的綜合處理,那麼可以再次利用介面,實現分離的方式,再次將實現解耦,標準的三板斧處理操作即可。
混合框架的分層架構圖
4、如何實現Winform開發的簡單化開發
由於Winform開發業務的日益複雜化,我們往往需要花費很多精力來做一些基礎性的東西,雖然邏輯很簡單,但是一些繁瑣性的工作卻很難避免,那麼我們平時進行Winform開發的時候,如何才能實現Winform開發中的簡化處理呢?
首先我們通過模組化來切分大項目的複雜度,然後再次進行類繼承的方式減少類級別的程式碼,重用基類特性。
前面我們介紹採用了一些模組化的方式來組裝項目,可以簡單的理解為積木組合的方式。如許可權管理模組、字典管理模組、自動更新模組、人員管理模組、通訊錄管理模組、分頁控制項、公用類庫等方面,這些可以在項目中根據情況採用對應的模組,非常高效,整個主體框架也有對應接入這些模組的案例程式碼供參考,因此可以更加直觀明了。
而另一方面,我們在對類的重用方面,也是精益求精,盡量做到精簡重複程式碼,提高開發效率的目的。
介面類提供封裝繼承,減少介面的一些繁瑣設置。
介面通過基類的封裝處理,我們可以把大多數通用的處理或者邏輯調用順序進行封裝,子類實現一些特殊的函數即可,同時可以統一調用基類的處理操作。
我們以常規業務模組介面來分析,主要有明細查看或編輯介面、列表介面,那麼這些介面為了方便使用,我們可以抽象一部分介面處理邏輯或者共有部分內容,放在介面基類BaseEdit或者BaseDock等基類裡面,如下介面所示。
基礎業務類,我們同樣也是採用重用基類方式,實現介面函數的封裝處理。
以及業務類繼承關係,當然還有其他更多的,基本上都提供一些基類來處理,簡化程式碼。
Web API的控制器設計對象繼承關係,如下所示:
除了這些基礎性的程式碼級別的簡化外,我們更高層次的簡化,可以通過資料庫=》程式碼生成的方式簡化處理,通過資料庫資訊,我們可以進一步生成我們應用業務的相關類或者介面部分,從而可以快速提高開發效率。
如對於普通的Winform介面項目,利用程式碼生成工具Database2Sharp,我們生成後的項目結構視圖如下所示。
而對於混合框架方案的項目,我們生成的介面項目結構視圖如下所示。
對於Winform開發,可以根據Winform框架或者混合框架的窗體介面類,生成標準的介面程式碼,列表介面默認具有分頁查詢、導入導出、高級查詢、編輯、刪除事件綁定,編輯介面則具有獲取數據並顯示在控制項,保存後執行更新或者寫入的操作。
如在程式碼生成工具裡面,設置主從表的介面生成如下所示。
生成的標準的主從表介面如下介面所示。
通過框架項目訂製化的程式碼生成工具,可以快速的生成我們所需要的相關分層的程式碼,並繼承好相關的類關係,以及標準調用程式碼,可以極大提高我們應用模組的開發速度,而且由於利用通過檢驗的標準件,開發出來的模組,除了快速外,也是健壯的。
另外們把常規的列表介面,新增、編輯、查看、導入等介面放在一起,除了列表頁面,其他內容以彈出層對話框的方式進行處理,如下介面示意所示。