Winform開發中的困境及解決方案

来源:https://www.cnblogs.com/wuhuacong/archive/2020/07/24/13370453.html
-Advertisement-
Play Games

在我們開發各種應用的時候,都會碰到很多不同的問題,這些問題涉及架構、模塊組合、界面處理、共同部分抽象等方面,我們這裡以Winform開發為例,從系統模塊化、界面組件選擇、業務模塊場景劃分、界面基類和輔助類處理、代碼生成工具輔助開發等方面介紹在實際項目開發過程中碰到的困境和相關的解決方案,以便分析其中... ...


在我們開發各種應用的時候,都會碰到很多不同的問題,這些問題涉及架構、模塊組合、界面處理、共同部分抽象等方面,我們這裡以Winform開發為例,從系統模塊化、界面組件選擇、業務模塊場景劃分、界面基類和輔助類處理、代碼生成工具輔助開發等方面介紹在實際項目開發過程中碰到的困境和相關的解決方案,以便分析其中是如何逐步提高效率和整體用戶體驗的。

1、系統模塊化

軟體和建築工程很類似,都是需要構建一個龐大而功能完整的一個系統,而工程化也意味著需要多人協作,那麼就需要把一個龐大的系統橫向或者縱向劃分為各個可以獨立施工完成的模塊,雖然各個模塊之間有所銜接或者交互,但是基本上可以以模塊化的方式來構建,這個也是工程化開發的精髓所在。

以一個軟體管理系統為例,我們儘可能把精力焦點放在客戶的業務需求上,而對於常規的如許可權控制、字典管理等一些常用的內容,由於它們的處理邏輯在特定領域上基本上比較固定一些,可以儘可能獨立並重覆使用,

而有時候,以某個特定的業務來說,同時很多處理規則也是不變的,因此也可以以業務模塊的方式來劃分,從而類似通用模塊的方式重覆使用。

模塊化類似小孩子搭積木的方式構建一個所要的形狀,雖然軟體和建築在這方面肯定更加複雜化,但是模塊化系統是大勢所趨,也是簡化開發、易於維護、提高系統健壯性的重要舉措。

 

2、界面組件選擇

在Winform內置的傳統樣式裡面,雖然提供了很多很好的界面組件,不過整體效果還是比較古板。為了增強界面的處理效果,我們一般使用一些第三方的界面套件作為Winform開發的基礎,這個除了可以提高整體界面的效果外,還在很多控制項層面提供豐富的處理和響應。

以前嘗試過各種類型的界面套件,最終還是對DevExpress情有獨鍾,不僅僅是因為它是大軟體公司開發的界面套件,也是因為它在界面層次提供了很多豐富的界面組件和強大的屬性設置,能夠極大滿足各種界面複雜的要求。

使用DevExpress界面套件,可以使得我們開發的界面更加漂亮,用戶體驗也更好。

 

或者類似效果

 

3、業務模塊的場景劃分

前面說過,一個系統為了簡化開發、易於維護、提高系統健壯性的可以把它按功能方式劃分為各個獨立模塊進行開發或者重用,而對於業務模塊來說,我們也還可以進一步細分。

一般系統界面中,大多數標準方式是展示業務數據的查詢列表,然後在根據需要對特定記錄進行編輯、查看、刪除等操作。

我們把常規的列表界面,新增、編輯、查看、導入等界面放在一起,除了列表頁面,其他內容以彈出層對話框的方式進行處理,如下界面示意所示。

如對於列表內容的展示,一般展示效果如下所示,主要展示資料庫裡面的二維表信息。

除了列表界面,另外一個就是對數據的明細展示界面了,這個界面內容可以更加多元化,如在裡面承載各種控制項,如文本、日期、圖片、下拉列表、樹形列表,以及我們自定義的一些控制項,如對於附件的通過管理展示控制項。

 

 有了這些標準的展示效果,我們就可以參照這些,使用代碼生成工具輔助頁面內容的生成的了,生成規則以資料庫元數據為參考即可。

 

4、界面基類和輔助類的處理

我們以常規業務模塊界面來分析,主要有明細查看或編輯界面、列表界面,那麼這些界面為了方便使用,我們可以抽象一部分界面處理邏輯或者共有部分內容,放在界面基類BaseEdit或者BaseDock等基類裡面,如下界面所示。

儘可能把一些涉及到業務數據的處理通用規則放到基類,而變化部分則在子類進行處理即可。這樣可以簡化生成界面的代碼,以及提高可重用率,減少維護的難度和代碼臃腫。 

對於一般的業務系統,可能都會涉及到不同資料庫的使用,如SQLServer、Oracle、Mysql、PostgreSQL等資料庫,那麼這部分,可以通過使用微軟企業庫或者其他ORM方式進行處理,以實現系統對多種資料庫的良好支持。

 

5、代碼生成工具輔助開發

通過上面的介紹,通用部分作為模塊獨立使用,業務模塊的界面主要劃分列表和編輯查看界面兩部分,而各自又進行了一定的基類抽象處理,那麼相對來說已經簡化很多了,不過對於業務數據來說,我們還是需要做很多重覆性的工作,如界面顯示、界面賦值及調用介面處理等操作,這些對業務對象固定的話,其實也是規則類似的,那麼這部分我們結合代碼生成工具進行批量生成即可,生成後進行一定的微調,可以極大降低出錯的幾率,減少代碼的編寫量。

 在我們開發軟體的時候,解決方案項目基於一定的分層組織,每個項目分層中,各個類的關係也是確定的,藉助輔助工具(結合模板引擎)可以快速生成我們所需要的代碼,並極大提高我們軟體的開發效率,Database2Sharp代碼生成工具就是一款專門針對我們自己框架結構配套的開發工具。

Database2Sharp代碼生成工具,主要是基於資料庫提取的元數據信息,根據表的信息和關係,欄位信息等內容,生成我們框架所需要分層的類代碼。

對於Winform開發,可以根據Winform框架或者混合框架的窗體界面類,生成標準的界面代碼,列表界面預設具有分頁查詢、導入導出、高級查詢、編輯、刪除事件綁定,編輯界面則具有獲取數據並顯示在控制項,保存後執行更新或者寫入的操作。

 

 

 

7、其他

除了前面介紹的部分外,一般大的方面,我們還可以以業務方式做一些獨立的組件模塊,以方便重覆使用,這個是大的方面。

模塊化,一般需要構建好對應的框架架構,每個獨立的模塊,都是遵循統一的框架架構方式處理,可以極大提高代碼的開發效率和降低維護的難度。

Winform開發架構如下所示。

 而對於混合方式的Winform開發,那麼還設計Web API模塊的部署,以及客戶端對Web API調用的封裝,如下所示。

 小的方面,還可以進一步劃分一些常用的界面處理元素,如自定義控制項的方式進行特殊組件的開發工作。如隨筆《在Winform界面使用自定義用戶控制項及TabelPanel和StackPanel佈局控制項》、《在Winform系統界面中對進展階段的動態展示和處理》。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本篇要學習的內容和知識結構概覽 函數的參數及其傳遞方式 1. 函數參數傳遞方式 傳值: 傳變數值: 將實參記憶體中的內容拷貝一份給形參, 兩者是不同的兩塊記憶體 傳地址值: 將實參所對應的記憶體空間的地址值給形參, 形參是一個指針, 指向實參所對應的記憶體空間 傳引用: 形參是對實參的引用, 形參和實參是同 ...
  • K近鄰演算法(KNN,K-NearestNeighbor)是機器學習或數據分析中最基礎、也是最簡單的演算法之一,這個演算法的思路就如同它字面上的意思“K個最近的鄰居”,想要得到某個樣本的某個特征的值(一個樣本通常有多個特征),就需要找到距離它最近的K個樣本,然後根據這些樣本的該特征的近似值作為它的特征值。 ...
  • 百度雲盤:Python入門經典以解決計算問題為導向的Python編程實踐PDF高清完整版免費下載 提取碼:6e8d 內容簡介 《Python入門經典:以解決計算問題為導向的Python編程實踐》是一本系統而科學的Python入門教程,美國密歇根州立大學等多所美國知名高校採用其作為編程語言的入門教材, ...
  • 大量使用的對象,重覆的創建和銷毀,很耗費性能,這個時候就要使用對象池技術。 ...
  • 一、函數嵌套 1.函數的嵌套調用 在調用一個函數的過程中又調用其他函數 將一個大工能拆解成很多小功能 每個函數名都是全局變數,可以在全局有效 2.函數的嵌套定義 在函數內定義其他函數 子函數只能能在函數中被使用,子函數名只在局部有效 最外層函數相當於一個容器,裝了很多子函數 3.函數的嵌套調用和嵌套 ...
  • 百度網盤:Python項目開發實戰(第2版)PDF高清完整版免費下載 提取碼:exep 內容簡介 本書來自真正的開發現場,是BePROUD公司眾多極客在真實項目中的經驗總結和智慧結晶。作者從Python的環境搭建開始講起,介紹了Web應用的開發方法、項目管理及審查、測試與高效部署、伺服器調試等內容, ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:彥頁走刀口 今天我們來看看用ghpython怎麼實現koch曲線的分形效果,前兩天分享的雪花分形是利用grasshopper的迴圈插件anemone實現的,然後有個小伙 ...
  • 前言 在朋友的項目有個自定義配置文件user.yml,其內容如下 user: userId: 1 name: 張三 email: [email protected] 其映射實體內容為如下 @Data @AllArgsConstructor @NoArgsConstructor @Builder @Pro ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...