Winform开发框架重构总结
最近一直致力于Winform開發(fā)框架的重構(gòu)工作,因為發(fā)現(xiàn)要維護傳統(tǒng)Winform開發(fā)框架、WCF開發(fā)框架、混合式開發(fā)框架,以及相關(guān)的模塊,包括權(quán)限管理、字典管理模塊、附件管理、人員管理等一些輔助模塊,很多代碼都會有重復(fù)的部分,優(yōu)化的框架是想提高效率,減少冗余重復(fù)代碼,本文總結(jié)Winform開發(fā)框架重構(gòu)工作中的一些經(jīng)驗總結(jié),以饗讀者,希望能夠?qū)Υ蠹矣幸欢ǖ膮⒖甲饔谩?/p>
1、公用類庫的分離處理
我的公用類庫是自己開發(fā)這么多年的總結(jié)、收集和整理,對大多數(shù)的類庫均進行優(yōu)化整理過,公用類庫的本意是對.NET內(nèi)置的類庫進行包裝使用,提高使用效率和減少復(fù)雜性,隨著開發(fā)項目的增多和不斷的總結(jié),有時候一些常用的第三方類庫包裝類也很常見,使用很頻繁,經(jīng)常在各個模塊中使用,因此把框架中常用到的類庫分為兩類,一個是".NET內(nèi)置類公用類庫“,一個是第三方類庫的包裝類,如我經(jīng)常用到的Aspose.Cell、Apose.Word、NPOI、Myxls等Office相關(guān)類庫的包裝類,還有Log4Net日志類、Zip壓縮類庫等等,如下界面是一個截圖。
這樣雖然在管理上增加多了一個公用類庫的程序集,但是這樣區(qū)分有利于我們對類庫的擴展和維護。
2、Winform框架基類的封裝和獨立
在這次的重構(gòu)工作中,很大程度上是提取所有框架和模塊中用到的各種基類到一個第三方類庫包裝類里面,然后在框架里面統(tǒng)一使用這個類庫,如原來數(shù)據(jù)訪問里面常用到的BaseBLL、BaseDAL、IBaseDAL、AbstractBaseDAL,其中BaseDAL雖然繼承了AbstractBaseDAL絕大多數(shù)的方法,但是不同的數(shù)據(jù)庫還是有一些小差異的,因此把BaseDAL分為了幾個不同數(shù)據(jù)庫版本的BaseDAL,包括Access、MySql、Oracle、SqlServer、Sqlite等數(shù)據(jù)庫的基類。
這樣把它們獨立出來,不用再每個數(shù)據(jù)訪問的模塊都復(fù)制一份,而且可以方便統(tǒng)一維護和升級,因為基類和接口一旦增加,所有的業(yè)務(wù)類都會同時具有增加的功能,非常利于維護擴展。除了數(shù)據(jù)訪問相關(guān)的基類,還對WCF服務(wù)等相關(guān)的基類也進行了抽取,這樣在WCF框架或者混合型框架中,就可以直接使用了。
3、在框架中使用封裝獨立的基類
1)傳統(tǒng)Winform框架的對象
把這些框架中常用到的類庫獨立抽取出來后,整個框架文件就比較簡潔很多了,也不用再多個模塊經(jīng)常使用BeyondCompare比較來比較去的,框架業(yè)務(wù)層和數(shù)據(jù)訪問層的項目截圖如下所示,業(yè)務(wù)層除了有一個BLLFactory類外,其他的類都是常規(guī)的業(yè)務(wù)處理對象,BLLFactory沒有提取到公用類庫,是因為需要當(dāng)前執(zhí)行類的一些信息來構(gòu)造業(yè)務(wù)對象和數(shù)據(jù)訪問對象;SqlServer數(shù)據(jù)訪問層則沒有任何多余的輔助類庫。
? ? ? ?
其中SqlServer數(shù)據(jù)訪問層的類,類定義的部分代碼如下所示。
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>/// 備件信息數(shù)據(jù)訪問類/// </summary>public class ItemDetail : BaseDALSQL<ItemDetailInfo>, IItemDetail{......................2)混合型框架的對象
在混合型框架對于WCF或者傳統(tǒng)Winfrom數(shù)據(jù)訪問中,我在其中定義了一個通用的接口層---Facade層,然后分兩種實現(xiàn)方式,其中Facade層的接口項目文件如下所示,其中可以看到,除了CallerFactory類外,其他部分均為接口定義,基類接口已經(jīng)抽取到獨立的類庫里面去了。
混合型框架的調(diào)用示例代碼如下所示,其中和傳統(tǒng)的Winform調(diào)用BLLFactory一樣,這里只需要調(diào)用CallerFactory構(gòu)造類即可,而傳入給CallerFactory的是Facade層的接口,工廠會根據(jù)配置參數(shù)進行相應(yīng)的對象構(gòu)造,從而實現(xiàn)基于傳統(tǒng)本地的數(shù)據(jù)庫訪問或者分布式的WCF數(shù)據(jù)訪問方式的綜合處理。
bool exist = CallerFactory<IItemDetailService>.Instance.CheckExist(this.txtItemNo.Text, ID);if (exist){MessageDxUtil.ShowTips("指定的備件編號已經(jīng)存在,不能重復(fù)添加,請修改");return false;}ItemDetailInfo info = CallerFactory<IItemDetailService>.Instance.FindByID(ID);if (info != null){.....................................其中Facade層的CallerFactory對象,會根據(jù)配置信息,尋找并構(gòu)建相應(yīng)的實現(xiàn)類,有可能是傳統(tǒng)的數(shù)據(jù)訪問類,也可能是WCF的數(shù)據(jù)訪問類,這兩種實現(xiàn)類的定義如下所示。
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方式的實現(xiàn)類方式如下所示
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;} ..............4 、使用引用文件方式代替復(fù)制文件方式
在一個框架里面,為了減少程序集的數(shù)量和多個引用,可能會有多處需要使用同一個文件,這樣就可以使用文件引用的方式,在VS里面添加現(xiàn)有文件的時候,選擇
如由于我的某一個框架里面,為了減少程序集的數(shù)量,我把很多相關(guān)的類庫集成在一起,形成一個單一的程序集就具有很多功能,但這樣的代碼雖然有很多個影子,但是肉身只有一個,方便維護。
這樣對于某個文件的多處使用,但是統(tǒng)一維護很方便。
5、代碼生成工具Database2Sharp的支持
以上的一些對象繼承關(guān)系和框架的整體代碼,項目工程之間程序集的引用,這些手工操作的話,肯定效率大打折扣,因此代碼生成工具的支持是非常必要的工作,本框架系列的最新繼承關(guān)系,全部能夠使用Database2Sharp的完美支持,從而使得我們在日常開發(fā)過程中,享受快速、高效、統(tǒng)一的代碼生成帶來的樂趣。
?
?以上就是我在框架重構(gòu)中的一些總結(jié),希望能給大家有所啟發(fā),有所幫助。最后附上Winform開發(fā)框架的一個功能總結(jié)圖形,Winform開發(fā)框架的主要功能概覽如下圖所示。
?本文轉(zhuǎn)自博客園伍華聰?shù)牟┛?#xff0c;原文鏈接:Winform開發(fā)框架重構(gòu)總結(jié),如需轉(zhuǎn)載請自行聯(lián)系原博主。
總結(jié)
以上是生活随笔為你收集整理的Winform开发框架重构总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《自控力》摘录
- 下一篇: portal商品展示功能逻辑