最近一直致力于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开发框架的主要功能概览以下图所示。