Winform开发框架重构总结

最近一直致力于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开发框架重构总结,如需转载请自行联系原博主。

时间: 2024-09-16 06:17:53

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

Winform开发框架之权限管理系统改进经验总结(3)系统登录黑白名单的实现

在一般的权限系统里面,可能经常会看到系统的黑名单或者白名单的拦截功能.在一般权限系统里面 ,常见的黑名单就是禁止用户在某些IP上登录系统,白名单就是允许用户只在某些IP上登录系统.本随 笔主要介绍在我的权限系统里面,如何实现这个黑白名单的功能,以及介绍在其中应用到的IP对比操作 ,IP段判断等操作代码. 1.黑白名单的配置 要完成黑名单的拦截和白名单的放行,我们需要进行名单的配置操作,我们把相关的配置放到列表里 面进行展示,可以添加多个黑名单或者白名单,如下界面所示. 开发框架之权限管理系统改进

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

权限管理系统的重要特性总结: 1) 高度集成的权限系统.独立模块,能快速整合使用. 2) 符合权限的国际通用标准,基于RBAC(基于角色的访问控制)的角色权限控制. 3) 多数据库架构支 持,内置支持SqlServer.Oracle.MySql.SQLite.Access数据库. 4) 用户管理基于分级管理理念 ,集团分子公司.事业单位处室/局级可独立管理人员/角色等数据. 5) 用户接入的各种应用系统, 均可实现用户登陆日志.操作日志的记录. 6) 管理员可以控制登陆用户的黑白名单列表,实现严

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

1.通用数据导入导出操作模块回顾 在我的Winfrom开发框架里面,有一个通用的导入模块,它在默默处理这把规范的Excel数据导入到不 同的对象表里面,一直用它来快速完成数据导入的工作.很早在随笔<Winform开发框架之通用数据导入 导出操作>里面就很全面的介绍过它的相关功能了,在代码生成工具Database2Sharp里面,生成的 Winfrom界面代码也已经把它的调用代码放进去了,因此使用起来真是很好,很开心. 在不断的项目实践中,发现使用基于Sqlite的客户端作为单机版的操作也越来越

Winform开发框架的业务对象统一调用方式

在这个纷繁的社会里面,统一性的特点能够带来很多高效的产出.牢固的记忆,这种特征无论对于企 业.个人的开发工作,知识的传承都有着非常重要的作用,Winfrom框架本身就是基于这个理念而生,从 统一的数据库设计规则开始,统一的项目格局,统一的业务类.数据访问类.实体类继承关系,再到统 一的公用类库,统一的权限管理模块,统一的字典管理模块,统一的附件管理...,理解这些理念和规则 后,再来个终极的统一,框架代码快速生成--Database2Sharp代码生成工具.所有的框架(包括传统 Winform开

Winform开发框架之附件管理应用

在很多常规的管理系统里面,都可能有附件管理的需求,在我做的一系列医疗行业的病人信息管理系 统里面,都希望能很好的管理病人的相关资料,分门别类的进行存储,需要的时候可以预览查看,那么 这个功能我们可以把它独立做成一个附件管理模块,这样可以在各个系统中集成即可,我曾经在 <Winform开发框架之通用附件管理模块>里面介绍过这样的附件模块,从那时候开始了,我需要附件模 块的时候,就通过集成起来即可,非常方便高效. 1.附件管理界面展示 附件管理在很多信息化管理系统中很普遍使用,例如我在病人管理系统

Winform开发框架之权限管理系统改进的经验总结(5) 用户分级管理

在实际的系统应用环境中,用户的分级管理一般也是比较常见的功能,小的业务系统可以不需要,但 是一般涉及到集团.分子公司.或者是事业单位里面的各个处室或者某某局的人员管理,这些分级管理 就显得比较必要,否则单靠管理员来处理账号的事情,是比较麻烦一点的.分级管理就是让不同层次. 不同机构的人员实现一定的自治管理,如分公司的人员有专门的管理员,各地区的处室或者某某局实现 内部人员的创建.调整.角色分配等工作.本篇随笔主要介绍在我的权限系统中如何实现人员的分级管 理的,给大家提供相应的思路和样例参考. 1

Winform开发框架之权限管理系统改进的经验总结(4)

一行代码实现表操作日志记录 在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代 码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加 .修改.删除等关键的操作,如果能在框架层面的支持基础上,以最少的代码实现重要表的日志记录, 那么是一件非常值得庆贺的事情,也能够为我们客户的数据提供重要的日志跟踪,甚至是数据恢复的参 考. 1.数据访问层的对象继承关系 首先,为了减少重复代码的编写,合理的继承关系是必要的,我们需要在数据访

Winform开发框架之权限管理系统改进经验总结(2)用户选择界面的设计

在上篇总结随笔<Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件 的使用>介绍了权限管理模块的用户管理部分,其中主要介绍了其中的用户所属公司.所属部门.直属 经理(人员列表)的几级数据级联的展示,通过引入TreeListLookupEdit控件,能增强用户的体验效果 .本篇继续介绍权限系统模块中的一些闪光点,介绍组织机构管理里面选择用户的界面设计和实现,用 户选择在很多场合会用到,如组织机构的用户选择,角色里面的用户选择,或者流程里面的用户选择

Winform开发框架之权限管理系统改进的经验总结(1)TreeListLoo

最近一直在做一些技术性的研究和框架改进工作,博客也落下好几天没有更新了,也该是时候静下心 来,总结这段时间的一些技术改进的经验了.和上一阶段的CRM系统开发和技术研究一样,我都喜欢在一 个项目或者模块完成后,做一些相关的总结性工作,记录下前一阶段的技术脚印,希望给自己留下一个 脚印快照,同时给读者了解自己的技术动向外,也有所收获.本随笔主要介绍在下拉列表中展示一个列 表,以便实现数据结构的良好展示,并能快速选定所需的节点,这个就是TreeListLookupEdit控件的使 用. 1.界面效果展