最近一直致力於Winform開發框架的重構工做,由於發現要維護傳統Winform開發框架、WCF開發框架、混合式開發框架,以及相關的模塊,包括權限管理、字典管理模塊、附件管理、人員管理等一些輔助模塊,不少代碼都會有重複的部分,優化的框架是想提升效率,減小冗餘重複代碼,本文總結Winform開發框架重構工做中的一些經驗總結,以饗讀者,但願可以對你們有必定的參考做用。數據庫
個人公用類庫是本身開發這麼多年的總結、收集和整理,對大多數的類庫均進行優化整理過,公用類庫的本意是對.NET內置的類庫進行包裝使用,提升使用效率和減小複雜性,隨着開發項目的增多和不斷的總結,有時候一些經常使用的第三方類庫包裝類也很常見,使用很頻繁,常常在各個模塊中使用,所以把框架中經常使用到的類庫分爲兩類,一個是".NET內置類公用類庫「,一個是第三方類庫的包裝類,如我常常用到的Aspose.Cell、Apose.Word、NPOI、Myxls等Office相關類庫的包裝類,還有Log4Net日誌類、Zip壓縮類庫等等,以下界面是一個截圖。框架
這樣雖然在管理上增長多了一個公用類庫的程序集,可是這樣區分有利於咱們對類庫的擴展和維護。分佈式
在此次的重構工做中,很大程度上是提取全部框架和模塊中用到的各類基類到一個第三方類庫包裝類裏面,而後在框架裏面統一使用這個類庫,如原來數據訪問裏面經常使用到的BaseBLL、BaseDAL、IBaseDAL、AbstractBaseDAL,其中BaseDAL雖然繼承了AbstractBaseDAL絕大多數的方法,可是不一樣的數據庫仍是有一些小差別的,所以把BaseDAL分爲了幾個不一樣數據庫版本的BaseDAL,包括Access、MySql、Oracle、SqlServer、Sqlite等數據庫的基類。工具
這樣把它們獨立出來,不用再每一個數據訪問的模塊都複製一份,並且能夠方便統一維護和升級,由於基類和接口一旦增長,全部的業務類都會同時具備增長的功能,很是利於維護擴展。除了數據訪問相關的基類,還對WCF服務等相關的基類也進行了抽取,這樣在WCF框架或者混合型框架中,就能夠直接使用了。優化
1)傳統Winform框架的對象this
把這些框架中經常使用到的類庫獨立抽取出來後,整個框架文件就比較簡潔不少了,也不用再多個模塊常用BeyondCompare比較來比較去的,框架業務層和數據訪問層的項目截圖以下所示,業務層除了有一個BLLFactory類外,其餘的類都是常規的業務處理對象,BLLFactory沒有提取到公用類庫,是由於須要當前執行類的一些信息來構造業務對象和數據訪問對象;SqlServer數據訪問層則沒有任何多餘的輔助類庫。spa
其中SqlServer數據訪問層的類,類定義的部分代碼以下所示。日誌
using WHC.Pager.Entity; using WHC.WareHouseMis.Entity; using WHC.WareHouseMis.IDAL; using WHC.Framework.Commons; using WHC.Framework.ControlUtil; using Microsoft.Practices.EnterpriseLibrary.Data; namespace WHC.WareHouseMis.DALSQL { /// <summary> /// 備件信息數據訪問類 /// </summary> public class ItemDetail : BaseDALSQL<ItemDetailInfo>, IItemDetail { ......................
2)混合型框架的對象code
在混合型框架對於WCF或者傳統Winfrom數據訪問中,我在其中定義了一個通用的接口層---Facade層,而後分兩種實現方式,其中Facade層的接口項目文件以下所示,其中能夠看到,除了CallerFactory類外,其餘部分均爲接口定義,基類接口已經抽取到獨立的類庫裏面去了。orm
混合型框架的調用示例代碼以下所示,其中和傳統的Winform調用BLLFactory同樣,這裏只須要調用CallerFactory構造類便可,而傳入給CallerFactory的是Facade層的接口,工廠會根據配置參數進行相應的對象構造,從而實現基於傳統本地的數據庫訪問或者分佈式的WCF數據訪問方式的綜合處理。
bool exist = CallerFactory<IItemDetailService>.Instance.CheckExist(this.txtItemNo.Text, ID); if (exist) { MessageDxUtil.ShowTips("指定的備件編號已經存在,不能重複添加,請修改"); return false; } ItemDetailInfo info = CallerFactory<IItemDetailService>.Instance.FindByID(ID); if (info != null) { .....................................
其中Facade層的CallerFactory對象,會根據配置信息,尋找並構建相應的實現類,有多是傳統的數據訪問類,也多是WCF的數據訪問類,這兩種實現類的定義以下所示。
using WHC.WareHouseMis.Entity; using WHC.WareHouseMis.BLL; using WHC.WareHouseMis.Facade; using WHC.Framework.ControlUtil; using WHC.Framework.ControlUtil.Facade; namespace WHC.WareHouseMis.WinformCaller { public class ItemDetailCaller : BaseLocalService<ItemDetailInfo>, IItemDetailService { private ItemDetail bll = null; public ItemDetailCaller() : base(BLLFactory<ItemDetail>.Instance) { bll = baseBLL as ItemDetail; } #region IItemDetailService 成員 public List<ItemDetailInfo> FindByBigType(string bigType) { return bll.FindByBigType(bigType); } ........................
而對於WCF方式的實現類方式以下所示
using WHC.WareHouseMis.Entity; using WHC.WareHouseMis.Facade; using WHC.Framework.Commons; using WHC.Framework.ControlUtil.Facade; namespace WHC.WareHouseMis.ServiceCaller { public class ItemDetailCaller : BaseWCFService<ItemDetailInfo>, IItemDetailService { public ItemDetailCaller() : base() { this.configurationPath = EndPointConfig.WcfConfig; this.endpointConfigurationName = EndPointConfig.ItemDetailService; }public List<ItemDetailInfo> FindByBigType(string bigType) { List<ItemDetailInfo> result = new List<ItemDetailInfo>(); IItemDetailService service = CreateSubClient(); ICommunicationObject comm = service as ICommunicationObject; comm.Using(client => { result = service.FindByBigType(bigType); }); return result; } ..............
在一個框架裏面,爲了減小程序集的數量和多個引用,可能會有多處須要使用同一個文件,這樣就可使用文件引用的方式,在VS裏面添加現有文件的時候,選擇
如因爲個人某一個框架裏面,爲了減小程序集的數量,我把不少相關的類庫集成在一塊兒,造成一個單一的程序集就具備不少功能,但這樣的代碼雖然有不少個影子,可是肉身只有一個,方便維護。
這樣對於某個文件的多處使用,可是統一維護很方便。
以上的一些對象繼承關係和框架的總體代碼,項目工程之間程序集的引用,這些手工操做的話,確定效率大打折扣,所以代碼生成工具的支持是很是必要的工做,本框架系列的最新繼承關係,所有可以使用Database2Sharp的完美支持,從而使得咱們在平常開發過程當中,享受快速、高效、統一的代碼生成帶來的樂趣。
以上就是我在框架重構中的一些總結,但願能給你們有所啓發,有所幫助。最後附上Winform開發框架的一個功能總結圖形,Winform開發框架的主要功能概覽以下圖所示。