1. 程式人生 > >[轉]Winform開發框架的重要特性總結

[轉]Winform開發框架的重要特性總結

工具 name 開發 管理系 lib copy 環境 com script

本文轉自:https://www.cnblogs.com/wuhuacong/p/3199829.html

從事Winform開發框架的研究和推廣,也做了有幾個年頭了,從最初的項目雛形到目前各種重要特性的加入完善,是經過了很多項目的總結歸納和升華,有些則是根據客戶需要或者應用前景的需要進行的完善,整個Winform開發框架具有很好的通用性和借鑒性,本文從該Winform開發框架進行概括總結,力求把各個重要的特性進行一些詳細的說明,使大家了解整個Winform開發框架的面貌和特性。

Winform開發框架總體性概括有:支持插件化應用開發,能夠動態配置及加載開發的插件;菜單支持動態配置,可根據用戶權限進行動態控制顯示;集成各種獨立開發好的模塊,如權限管理系統、字典管理模塊等,自動更新模塊等,實現系統的權限控制、字典管理、軟件支持遠程自動更新等功能;可重復使用的系統基礎模塊,Winform分頁控件和.NET開發公用類庫等;整個框架通過與代碼生成工具Database2Sharp進行配合,能夠一鍵生成整體性框架代碼,Winform系統界面代碼,開發更高效。

整個Winform開發框架,提供了很多常見業務系統提供的功能,包括Excel數據導入導出,能快速導入自定義模塊的Excel數據,快速導出列表數據;自定義Excel自定義模板報表的生成,生成各種復雜的Excel報表;強大通用的統計圖表模塊,數據統計更方便;基於多數據的數據查詢模塊和通用高級查詢模塊,查詢數據更方便;框架提供基於多種數據庫(Sqlserver/Oracle/Mysql/Sqlite/Access)的整合,能夠手動配置數據庫類型,通用模塊內置支持多種數據庫切換;框架提供了高度封裝的數據訪問基類,開發代碼更少更高效;框架界面基類也進行統一封裝,使用更方便,效果更統一;框架提供基礎性的支持,包括集成登陸、閃屏、托盤功能,以及為插件模塊提供登陸用戶信息和系統信息。

Winform開發框架的主要功能概覽如下圖所示。

技術分享圖片

1、支持插件化應用開發,能夠動態配置及加載開發的插件

框架實現基於插件化的應用,如下所示。

技術分享圖片技術分享圖片

支持插件化應用的開發框架能給程序帶來無窮的生命力,也是目前很多系統、程序追求的重要方向之一,插件化的模塊,在遵循一定的接口標準的基礎上,可以實現快速集成,也就是所謂的熱插拔操作,可以無限對已經開發好系統進行擴展,而且不會影響已有的功能,不再需要的模塊,通過修改配置移除即可。

插件化應用也是目前框架和系統開發的主流方向,從開發企業的產品管理角度來看,第一可以把控好已有的框架產品,第二可以把內部的人員分配到不同的業務模塊中,讓他們遵循一定的接口即可快速開發,從而提高團隊對業務模塊的橫向切割和快速開發的效率,更好、統一、高效完成企業化應用框架的搭建和使用。

2、菜單支持動態配置,可根據用戶權限進行動態控制顯示

一般Winform程序中,菜單都是直接寫在主程序中的,這樣對於修改和維護菜單的相關信息,可能有所不便,而且對於插件化應用,新增菜單是常見的事情,這樣就需要對菜單進行動態配置管理了,通過後臺菜單的配置和權限的指定,能夠實現菜單的動態加載和權限驗證。

因此菜單也是權限分配的一部分,為了有效管理菜單資源,我們把菜單放到權限管理系統中進行管理控制。

技術分享圖片

設定好菜單的圖標和Winform窗體類型,就能在Winform框架中動態構建菜單信息了。菜單的圖表放置在系統的相對目錄下即可。

技術分享圖片

技術分享圖片

3、集成各種獨立開發好的模塊,如權限管理系統、字典管理模塊等,自動更新模塊等

3.1 權限管理模塊

權限的分配和管理,基本上是每個業務系統需要考慮的東西,而這些常用的東西,在整個Winform開發框架中,把它作為一個獨立的模塊,既方便維護管理,也留有接口很容易進行集成,這樣能夠在項目中反復進行使用。

權限系統需要考慮的系統用戶、組織機構、角色、權限定義及分配、菜單管理、用戶登錄日誌等相關信息。對於每新增一個系統,我們只需要在權限管理系統中增加一個系統類型定義,以及相關的功能、菜單數據即可,非常方便管理。

技術分享圖片

3.2 字典管理模塊

另外,除了權限的管理,字典管理也是常規業務模塊的一個總要功能,因此字典管理模塊在Winform開發框架中,也是一個獨立的模塊進行開發管理,在使用的時候進行集成即可。

字典的分類可以按多級進行分類管理,可以拖拉進入新的分類,非常方便。

技術分享圖片

3.3 自動更新模塊

一般情況下,為了有效管理應用程序的發布及更新,我們需要軟件支持遠程自動更新功能;在Winform開發框架中再引入一個自動升級更新的通用模塊,這個自動升級的通用模塊除了具備一般的功能外,可以通過配置程序標題、升級路徑方式等方式,實現通用化的升級操作,其他需要升級的程序,拿過來就可以使用,經過項目的整合及優化,已經具備較好的應用前景了。

本通用自動更新模塊具有下面幾個特點:

1)程序標題可配置,更新路徑可配置,適用於各種需要更新的項目整合。

2)支持文件復制或者對壓縮包進行解壓,適合更多瑣碎程序集的整體升級。

3)支持文件更新後自動啟動,或者帶參數的啟動方式。

技術分享圖片

4、可重復使用的系統基礎模塊,Winform分頁控件和.NET開發公用類庫等

4.1 Winform分頁控件

為了提高數據的獲取及顯示效率,一般情況下,我們都需要對數據進行分頁獲取和顯示,在網絡化環境,這種方式獲取數據特別重要,在Winform裏面,沒有現成的分頁控件可以使用,因此出於這個考慮,把數據顯示、數據導出、數據打印等眾多功能集成一起,更加方便使用。分頁控件完美支持列表數據的分頁,可以調整顯示列及順序,是否顯示復選框,字段別名,奇偶列的顏色變化,列信息提示和數據復制等等眾多實用細致的功能的。

列表的數據綁定及顯示代碼,通過代碼生成工具,可以一鍵生成所需的界面代碼,開發效率飛一般的提升。

技術分享圖片

技術分享圖片

4.2 .NET公用類庫

俗話說,一個好漢十個幫,眾人拾柴火焰高等都說明一個道理,有更多的資源,更豐富的積累,都是助你走向成功,走向頂峰的推動力。就我們開發者而言,其中技巧的積累、資源的積累,就是類似一個個好漢、一根根好柴,是我們能夠進行高效開發的保證和推動力。

這些類庫是我從事多年軟件開發,逐漸提煉和發現的一些閃光點或者好片段,有些是吸收別人的優秀的東西,有些是自己逐步提煉的精華,以前,在網絡上看到一些開源的項目,總會先看看其是否有封裝良好、功能獨立的輔助類庫,發現好的輔助類庫,總是欣喜若狂好一陣子,學習中逐步積累,研究中逐漸提煉,多年過後,略有小成,終為今天所介紹的輔助類庫集合。這些輔助類庫平時也並不是所有的都會用得上,不過一些常用的,幾乎各個項目就會用到,類庫涉及面非常廣,能夠為我們開發節省很多時間,並且我們也可以根據自己的需要進行擴充完善,形成自己的類庫集合。

博客公用類庫在線幫助文檔列表:

 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(1)----開篇總結
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(2)----常用操作
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(3)----數據庫相關操作
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(4)----CSV、Excel、INI文件、獨立存儲等文件相關
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(5)----熱鍵、多線程、窗體動畫凍結等窗體操作
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(6)----全屏截圖、圖標獲取、圖片打印、頁面預覽截屏、圖片復雜操作等
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(7)-----聲音播放、硬件信息、鍵盤模擬及鉤子、鼠標模擬及鉤子等設備相關
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(8)----非對稱加密、BASE64加密、MD5等常用加密處理
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(9)----各種常用輔助類
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(10)---各種線程同步的集合類
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(11)---各種線程相關操作類
 厚積薄發,豐富的公用類庫積累,助你高效進行系統開發(12)--- 網絡相關操作輔助類

5、代碼生成工具Database2Sharp的整合

整個框架通過與代碼生成工具Database2Sharp進行配合,能夠一鍵生成整體性框架代碼,Winform系統界面代碼,開發更高效。

技術分享圖片

在整個Winform開發框架中,Database2Sharp生成出來的代碼體現了非常完美的整合性,能夠無縫接入開發的框架系統中,無論是常規的業務邏輯和數據訪問層代碼,以及一些列表、編輯界面的Winform界面代碼,都能快速生成,稍作調整即可滿足業務模塊的需要。

Database2Sharp是一個簡單點擊幾次鼠標就能完成一周代碼量的代碼生成工具,效率驚人、友好體貼,真正的開發好伴侶。提供了對SqlServer 2000、SqlServer 2005、Oracle、Mysql、Access、SQLite的支持;可以生成各種架構代碼、Winform界面代碼,並且和Winform開發框架完美整合,體現出更高的開發效率。

技術分享圖片

6、通用的Excel數據導入導出,能快速導入自定義模塊的Excel數據,快速導出列表數據

由於一般的業務系統,經常性的數據導入時很正常的業務需求,因為畢竟使用Excel來操作數據也很方便,或者由於系統之間的數據交換需要,我們需要提供一個入口給客戶導入所需要的數據。但是導入數據的時候,不同的業務數據對應不同的Excel文件,很難做到統一,但如果是每個業務模型,都創建一個不同的導入界面來操作Excel數據,又會覺得可能某種程度上重復勞動,增加開發及維護成本。

那麽有無一種介於兩者之間的方法,來實現效率的最優化,並且能夠統一利用好一個導入的界面呢,在開發領域,只要能想到的,一般也能做到,由於工作的需要,在我的Winform開發框架中引入了一個通用的數據導入模塊,來實現這個既是統一,又是變化的業務需求。Winform框架提供的個通用的Excel數據導入導出機制,通過代碼生成工具Database2Sharp自動生成的代碼,就包含了如何使用這個通用導入模塊的相關代碼以及該模塊的導出數據的代碼,我們要做的就是在系統運行起來,導出一些數據作為某個模塊的Excel模板即可。下面的功能按鈕就是使用代碼生成工具自動生成的界面包含的按鈕。

技術分享圖片

通用數據導入功能,包含下面幾個方面的內容。

技術分享圖片

下面就是一個實際生成的功能模塊,其導入界面的運行效果。

技術分享圖片

在最底的狀態欄裏面,但我們保存數據的時候,會調用後臺線程進行數據保存,並顯示數據導入的進度狀態,由於是采用後臺線程處理,不會阻塞當前的界面,在多文檔的Winform開發框架界面中,可以切換到其他業務界面進行其他處理,不影響整體界面操作。

7、自定義Excel自定義模板報表的生成,生成各種復雜的Excel報表

很多情況下,我們需要生成比較專業的Excel模塊,因此自定義模板報表就是一種很好的方案,Winform開發框架提供了多種自定義Excel報表的生成。

技術分享圖片

使用普通的二維表,雖然能滿足大多數的情況,不過在一般的業務中,自定義模板的報表根據貼近實際,符合客戶的要求,雖然自定義模板的報表,比普通的二維報表復雜一些,不過利用Apose.Cell控件,並在預設模板中預設變量,可以生成很復雜的報表。

具體的自定義模板報表可以參考下我總結的兩篇文章。

使用Aspose.Cell控件實現Excel高難度報表的生成(一)

使用Aspose.Cell控件實現Excel高難度報表的生成(二)

例如生成一個標準的出庫單,這個表單有表頭信息,列表數據信息,並非一個普通的二維表,而且這種格式比較固定,因此很適合自定義模塊報表的生成操作。

技術分享圖片

其他設計模板如下所示:

技術分享圖片

實際生成的報表如下所示:

技術分享圖片

8、強大通用的統計圖表模塊,數據統計更方便

統計圖表在很多項目都可能用到,集成到框架中,更方便大家對一些圖表項目的設計理解以及功能的重用。在一般的傳統的框架中,可以采用ZedGraph開源控件或者微軟自帶的MSChart進行圖表設計,DevExpress控件套件有自己的圖表控件,這裏主要介紹基於DevExpress控件的圖表控件進行圖表設計。

8.1 普通統計圖表

這裏指的普通統計圖表,只是對表某一項目進行單一的統計,可以從餅狀圖、柱狀圖的圖表中體現這些項目各自所占的比例和數值,在Winform框架中的普通統計圖表模塊中,包括了餅狀圖、柱狀圖和數據表格,這樣更方便對數據進行全面的分析和查看。整個模塊是可以重用的,指定字段屬性就可以比較合理的展現出不同分類項目的統計效果了,具體效果圖如下所示。

技術分享圖片

上面的統計圖表中,還包含了下面兩個功能模塊,如下所示。

技術分享圖片

技術分享圖片

8.2 動態項目統計圖表

有時候,對於表裏面的數據,可能要對不同類型的內容進行動態的統計,以確定他們各自的比例情況,那麽這些動態項目的統計圖表就比較合適了,例如,對於病人資料的管理,可能需要統計各種病種所占的比例或者各種職業類型的犯病率,這些不太確定的統計項目,就需要一個能夠支持動態項目的統計圖表進行支撐,對於本Winform框架,為了較好呈現這個類型報表的意義,我選擇了對備件類型所占的比例進行一個統計分析,得到下面的統計圖表,如下所示。

技術分享圖片

上面的圖表統計,除了能夠根據一些條件進行限定查詢範圍外,還可以對一些預設的統計字段進行動態選取,然後根據字段裏面的各種內容(統計項目)進行統計,這樣就可以比較有效的統計出各種類型的數值和比例了。

8.3 多重坐標對比統計圖表模塊

在Winform框架裏面,可以對某一年各月份的出入庫數量進行一個分析,得到下面的統計圖。

技術分享圖片

以上數據不多,展現可能不太好看,下面我給出我另一個軟件系統的界面,其中對病人的出入院記錄進行一個統計對比分析,統計報表如下所示。

技術分享圖片

9、基於多數據庫的數據查詢模塊和通用高級查詢模塊,查詢數據更方便

在我的Winform開發框架中,使用了一個查詢輔助類SearchCondition來實現查詢條件的獲取和轉化,這個輔助類內置了對多種數據庫條件的分析處理,因此能夠很好生成所需要的數據查詢條件,正確高效獲取所需的數據進行顯示。

技術分享圖片
        /// <summary>
        /// 根據查詢條件構造查詢語句
        /// </summary> 
        private string GetConditionSql()
        {
            //如果存在高級查詢對象信息,則使用高級查詢條件,否則使用主表條件查詢
            SearchCondition condition = advanceCondition;
            if (condition == null)
            {
                condition = new SearchCondition();
                condition.AddCondition("ItemName", this.txtName.Text, SqlOperator.Like)
                    .AddCondition("ItemBigType", this.txtBigType.Text, SqlOperator.Like)
                    .AddCondition("ItemType", this.txtItemType.Text, SqlOperator.Like)
                    .AddCondition("Specification", this.cmbSpecNumber.Text, SqlOperator.Like)
                    .AddCondition("MapNo", this.txtMapNo.Text, SqlOperator.Like)
                    .AddCondition("Material", this.txtMaterial.Text, SqlOperator.Like)
                    .AddCondition("Source", this.txtSource.Text, SqlOperator.Like)
                    .AddCondition("Note", this.txtNote.Text, SqlOperator.Like)
                    .AddCondition("Manufacture", this.txtManufacture.Text, SqlOperator.Like)
                    .AddCondition("ItemNo", this.txtItemNo.Text, SqlOperator.LikeStartAt)
                    .AddCondition("WareHouse", this.txtWareHouse.Text, SqlOperator.Like)
                    .AddCondition("Dept", this.txtDept.Text, SqlOperator.Like)
                    .AddCondition("UsagePos", this.txtUsagePos.Text, SqlOperator.Like)
                    .AddCondition("StoragePos", this.txtStoragePos.Text, SqlOperator.Like);
            }
            string where = condition.BuildConditionSql().Replace("Where", "");
            return where;
        }
技術分享圖片 技術分享圖片
    /// <summary>
    /// Sql的查詢符號
    /// </summary>
    public enum SqlOperator
    {
        [Description("Like 模糊查詢")]
        Like,

        [Description("Not LiKE 模糊查詢")]
        NotLike,

        [Description("Like 開始匹配模糊查詢,如Like ‘ABC%‘")]
        LikeStartAt,

        [Description("= 等於號")]
        Equal,

        [Description("<> (≠) 不等於號")]
        NotEqual,

        /// <summary>
        /// > 大於號
        /// </summary>
        [Description("> 大於號")]
        MoreThan,

        [Description("<小於號")]
        LessThan,

        [Description("≥大於或等於號 ")]
        MoreThanOrEqual,

        [Description("≤ 小於或等於號")]
        LessThanOrEqual,

        [Description("在某個字符串值中")]
        In
    }
技術分享圖片

另外,一個好的數據查詢 ,一般有一個強大的高級查詢模塊,這個模塊在很多程序中都很常見,也是給客戶擴展查詢的一個很好的補充,由於我一直希望我的Winform開發框架能夠精益求精,所以做了這個通用高級查詢模塊,希望對今後我自己所有的項目以及框架本身,都能高效的使用。

技術分享圖片

在介紹輸入條件的時候,我們註意到,查詢輸入,基本上可以分為幾類:其一是常規的文本類型,使用文本框替代即可;其二是下拉列表類型,用戶從列表下面選擇內容;其三是日期類型,需要用戶指定開始日期和結束日期;其四是數字類型,需要用戶指定起始和結束的數值。

1)常規的文本類型條件輸入界面:

技術分享圖片

2) 下拉列表類型條件輸入界面:

技術分享圖片

3) 日期類型條件輸入界面:

技術分享圖片

4) 數字類型條件輸入界面:

技術分享圖片

10、框架提供基於多種數據庫(Sqlserver/Oracle/Mysql/Sqlite/Access)的整合

雖然我們在實際項目中,一般采用一種數據庫進行處理,但是不同的項目,采用的數據庫類型可能不同,本Winform開發框架為了方便演示和擴展的需要,內置支持了Sqlserver/Oracle/Mysql/Sqlite/Access,更多的數據庫,也可以通過擴展數據庫訪問基類的方式進行更多數據庫的支持。

Winform開發框架裏面的所有模塊,如用到了數據存儲的,如權限管理管理模塊、通用數據字典管理模塊,均內置支持這幾種數據庫的整合支持。整個Winform開發框架的數據庫訪問,能夠手動配置數據庫類型,對於同一種數據庫,也可以把數據存儲分開存儲,如業務數據存儲在一個數據庫,權限管理控制存儲在另外一個數據庫這種方式。

技術分享圖片

Winform開發框架提供多種數據庫支持,數據訪問基類依然很精簡,因為我們利用的數據庫訪問模塊是EnterpriseLibrary,把數據庫抽象化,並且我把所有數據庫通用操作放在了一個超級基類上,具體的數據庫基類只需要實現變化的部分即可。業務訪問類則使用泛型進行封裝處理。

因此,Winform開發框架提供了高度封裝的數據訪問基類,開發代碼更少更高效。

11、框架界面基類也進行統一封裝,使用更方便,效果更統一

為了更好開發常用界面模塊,Winform開發框架把一些公用的界面模塊,統一放置在了一個BaseUI的項目中,把其中的通用高級查詢、通用數據導入模塊、常見處理界面基類,插件接口等模塊放在一起,根據易於管理和使用。這樣開發的模塊,重用很多常規的界面,開發效率更快,使用更方便,效果更統一了。

技術分享圖片

12、框架提供基礎性的支持,包括集成登陸、閃屏、托盤功能,以及為插件模塊提供登陸用戶信息和系統信息

整個Winform開發框架,是有一個框架啟動模塊進行集中處理的,系統啟動後,用戶登錄處理後,通過動態加載菜單和插件模塊,並在主體框架界面中進行展示,提供權限控制和登錄用戶信息等方面的框架支持。另外框架支持閃屏圖片的動態配置,系統激活熱鍵和托盤縮小燈功能。

技術分享圖片

由於系統登錄後,框架本身存儲了用戶登錄和權限信息,框架動態加載某個模塊後,會把用戶信息和權限控制信息,註入到模塊的界面基類中,因此插件的界面模塊只要是繼承了BaseUI的界面基類,就能夠獲取到用戶信息和權限控制信息了。

特性總結

Winform框架,本身就是為了能夠快速開發一個高效、穩定、美觀大方、擴展性強的應用軟件系統。因此我在自己十年左右的共享軟件開發生涯以及公司項目開發中,不斷思考,精雕細琢,對很多重要的特性都進行了歸納和升華,吸收項目中好的閃光點,借鑒一些好的軟件開發思路,力求把軟件做的更好;在開發效率方面,除了開發一些常規通用的模塊、在模塊內部又充分考慮繼承、重用的規則,還對大幅度提高效率的代碼生成工具,根據Winform開發框架的實現思路和特點,進行了完善優化,使得無論在業務代碼生成,還是在界面代碼生成方面,均能把開發效率發揮到極致,希望整個Winform開發框架能夠持續發揮它的魅力和吸引力,為更多的人帶來希望,體驗開發的樂趣。

[轉]Winform開發框架的重要特性總結