最近一直致力于Winform开发框架的重构工作,因为发现要维护传统Winform开发框架、WCF开发框架、混合式开发框架,以及相关的模块,包括权限管理、字典管理模块、附件管理、人员管理等一些辅助模块,很多代码都会有重复的部分,优化的框架是想提高效率,减少冗余重复代码,本文总结Winform开发框架重构工作中的一些经验总结,以飨读者,希望能够对大家有一定的参考作用。

1、公用类库的分离处理

我的公用类库是自己开发这么多年的总结、收集和整理,对大多数的类库均进行优化整理过,公用类库的本意是对.NET内置的类库进行包装使用,提高使用效率和减少复杂性,随着开发项目的增多和不断的总结,有时候一些常用的第三方类库包装类也很常见,使用很频繁,经常在各个模块中使用,因此把框架中常用到的类库分为两类,一个是".NET内置类公用类库“,一个是第三方类库的包装类,如我经常用到的Aspose.Cell、Apose.Word、NPOI、Myxls等Office相关类库的包装类,还有Log4Net日志类、Zip压缩类库等等,如下界面是一个截图。

这样虽然在管理上增加多了一个公用类库的程序集,但是这样区分有利于我们对类库的扩展和维护。

2、Winform框架基类的封装和独立

在这次的重构工作中,很大程度上是提取所有框架和模块中用到的各种基类到一个第三方类库包装类里面,然后在框架里面统一使用这个类库,如原来数据访问里面常用到的BaseBLL、BaseDAL、IBaseDAL、AbstractBaseDAL,其中BaseDAL虽然继承了AbstractBaseDAL绝大多数的方法,但是不同的数据库还是有一些小差异的,因此把BaseDAL分为了几个不同数据库版本的BaseDAL,包括Access、MySql、Oracle、SqlServer、Sqlite等数据库的基类。

这样把它们独立出来,不用再每个数据访问的模块都复制一份,而且可以方便统一维护和升级,因为基类和接口一旦增加,所有的业务类都会同时具有增加的功能,非常利于维护扩展。除了数据访问相关的基类,还对WCF服务等相关的基类也进行了抽取,这样在WCF框架或者混合型框架中,就可以直接使用了。

3、在框架中使用封装独立的基类

1)传统Winform框架的对象

把这些框架中常用到的类库独立抽取出来后,整个框架文件就比较简洁很多了,也不用再多个模块经常使用BeyondCompare比较来比较去的,框架业务层和数据访问层的项目截图如下所示,业务层除了有一个BLLFactory类外,其他的类都是常规的业务处理对象,BLLFactory没有提取到公用类库,是因为需要当前执行类的一些信息来构造业务对象和数据访问对象;SqlServer数据访问层则没有任何多余的辅助类库。

       

其中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)混合型框架的对象

在混合型框架对于WCF或者传统Winfrom数据访问中,我在其中定义了一个通用的接口层---Facade层,然后分两种实现方式,其中Facade层的接口项目文件如下所示,其中可以看到,除了CallerFactory类外,其他部分均为接口定义,基类接口已经抽取到独立的类库里面去了。

混合型框架的调用示例代码如下所示,其中和传统的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;
}
..............

4 、使用引用文件方式代替复制文件方式

在一个框架里面,为了减少程序集的数量和多个引用,可能会有多处需要使用同一个文件,这样就可以使用文件引用的方式,在VS里面添加现有文件的时候,选择

如由于我的某一个框架里面,为了减少程序集的数量,我把很多相关的类库集成在一起,形成一个单一的程序集就具有很多功能,但这样的代码虽然有很多个影子,但是肉身只有一个,方便维护。

这样对于某个文件的多处使用,但是统一维护很方便。

5、代码生成工具Database2Sharp的支持

以上的一些对象继承关系和框架的整体代码,项目工程之间程序集的引用,这些手工操作的话,肯定效率大打折扣,因此代码生成工具的支持是非常必要的工作,本框架系列的最新继承关系,全部能够使用Database2Sharp的完美支持,从而使得我们在日常开发过程中,享受快速、高效、统一的代码生成带来的乐趣。

以上就是我在框架重构中的一些总结,希望能给大家有所启发,有所帮助。最后附上Winform开发框架的一个功能总结图形,Winform开发框架的主要功能概览如下图所示。

Winform开发框架重构总结的更多相关文章

  1. 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

    由于一个客户朋友的需求,需要我的Winform开发框架支持国产达梦数据库的操作,这个数据库很早就听过,但是真正一般项目用的很少,一般在一些特殊的项目可能需要用到.由于我的Winform开发框架,是基于 ...

  2. Winform开发框架中实现同时兼容多种数据库类型处理

    在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适 ...

  3. Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(2)

    本篇继续上篇<Winform开发框架之存储过程的支持--存储过程的实现和演化提炼(1)>来对Winform开发框架之存储过程的支持进行介绍,上篇主要介绍了SQLServer和Oracle两 ...

  4. Winform开发框架之读卡器和条码扫描枪的数据接收处理

    在我们开发一些项目的时候,一般需要一些外围的设备进行数据处理,如ID/IC读卡器获取卡号.激光条码扫描枪.USB摄像头.USB方式的小票据打印机(POS打印机).USB来电录音盒.普通打印机等一系列附 ...

  5. Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持

    在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适 ...

  6. WinForm开发框架--动态读取DLL模式

    1\ WinForm开发框架--动态读取DLL模式   http://www.2cto.com/kf/201306/217199.html 2\ 广州爱奇迪     http://www.iqidi. ...

  7. Winform开发框架之介绍

    winform开发框架,尽量减少程序员在界面中的代码量和工作量,Model自动生成,界面以及控件自动生成,简单的逻辑自动生成.自动生成的界面已经实现简单逻辑增删改查功能. 其他开发框架都已经或多火烧实 ...

  8. Winform开发框架之通用数据导入导出操作的事务性操作完善

    1.通用数据导入导出操作模块回顾 在我的Winfrom开发框架里面,有一个通用的导入模块,它在默默处理这把规范的Excel数据导入到不同的对象表里面,一直用它来快速完成数据导入的工作.很早在随笔< ...

  9. Winform开发框架之权限管理系统功能介绍

    权限管理系统的重要特性总结: 1) 高度集成的权限系统.独立模块,能快速整合使用.2) 符合权限的国际通用标准,基于RBAC(基于角色的访问控制)的角色权限控制.3) 多数据库架构支持,内置支持Sql ...

随机推荐

  1. oracle 判断中文函数

    create or replace function func_chinese(  p_str     in varchar2,     -- 输入的字符串  p_code    in varchar ...

  2. sql 字符次数

    FParentPath 查询字段 本条语句 条件是 ,  查询 , 在这个字段出现了几次 1=没有 2=1次 3=2次(依次累加)

  3. C代码中如何调用C++ C++中如何调用C

    注意这里的C调用C++或者C++调用C意思是.c文件中调用.cpp文件中代码,或者相反. 集成开发环境如VC++6.0或者vs都是以文件后缀来区别当前要编译的是C代码还是C++代码,然后采用响应的编译 ...

  4. 查看、关闭linux自启动网络服务

    1.查看 netstat --tulnp ..master  smtp 服务 2.关闭 /etc/init.d/服务 stop 停止 : start 启动 chkconfig 服务 off  关闭   ...

  5. Android Studio 简单功能介绍

    Android Studio  建立系统工具包你用来生成,测试,运行您的应用程序和软件包.构建系统是独立于Android的工作室,所以你可以调用它的Android的工作室或从命令行.在你写你的应用程序 ...

  6. There is no mode by that name loaded / mode not given 产生原因(个案)

    使用jQM DateBox用于界面显示日期选择控件,结果发现之前是正常的.今天用就不行啦.提示There is no mode by that name loaded / mode not given ...

  7. Careercup 论坛上较有意思的题目整理

    # 数据结构类 ### 线段树 segment tree http://www.careercup.com/question?id=5165570324430848 找区间内的value的个数 二维线 ...

  8. 支付SDK的安全问题——隐式意图可导致钓鱼攻击

     该漏洞涉及到app所使用的intent和intent filter. intent是一个可用于从一个app组件请求动作或处理事件的“消息对象”.Intent负责对应用中一次操作的动作.动作涉及数据. ...

  9. sp_executesql 两种写法

    写法1: AlTER PROCEDURE TryAgain @ReturnValue int output AS declare @aa nvarchar(), @ForumID int, @coun ...

  10. Physical Based Shading in Unreal Engine 3

    Roughness = 0.1roughness = 0.4roughness = 0.7roughness = 0.999 以上的Fresnel 0° = {1.0,0.86.0.57}(PS: 近 ...