文档章节

c#winform开发启示录(创世纪新篇)

crossmix
 crossmix
发布于 2015/10/29 18:07
字数 1682
阅读 70
收藏 1

  c#winform可以实现许多软件项目,包括webbrowser等等。

c#语言包括许多开发框架,如Winform开发框架、WCF开发框架、混合式开发框架,以及相关的模块,包括权限管理、字典管理模块、附件管理、人员管理等一些辅助模块,很多代码都会有重复的部分,优化的框架是想提高效率,减少冗余重复代码,以飨读者,希望能够对大家有一定的参考作用。

one、公用类库的分离处理

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

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

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

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

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

1)传统Winform框架的对象

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

其中SqlServer数据访问层的类,类定义的部分代码,click as follows,

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
    {
               ......................
复制代码

two)混合型框架的对象

在混合型框架对于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;
        }
..............
复制代码

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

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


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



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

 

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

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

 

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


c#winform项目有很多,可以共同探讨。

end


© 著作权归作者所有

crossmix
粉丝 72
博文 305
码字总数 645711
作品 0
广州
高级程序员
私信 提问
c#项目开发启示录(创世纪新篇)

网站管理员下个月就要去进行Java开发了,以后C#碰的就少了,平时一些经验都记在OneNote里面,现在收集整理出来,因为只能利用交接工作的打酱油的时间,。。。。。。 C#开发: 1、目标平台的选...

crossmix
2015/09/24
66
0
cocos 2d-x游戏开发启示录(创世纪新篇)

cocos 2d-x可以在pc电脑window,mac操作系统上开发游戏,也可以在移动设备上开发游戏,比如Android,windowphone等上开发,集成开发环境是:visual studio,eclipse,游戏引擎包括:粒子场景,...

crossmix
2015/09/21
93
0
c#Winform自定义控件-目录

前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。 开源地址:https://gitee.com/kwwwvagaa/netwinformcustom_control 如果觉得写的还行,请点个 star 支持一下...

冰封一夏
08/16
0
0
js+c#打造多语种输入法虚拟键盘的网站在线输入(创世纪篇)

个性化的VirtualKeyboard,虚拟键盘,即不需要用输入法打字,直接在网页中实现多语种在线输入。有点类似沪江小D,dahanyu.com,青云在线的网站。 最近做项目时,客户需要利用触摸屏进行操作,不...

crossmix
2015/11/27
592
0
我的友情链接

51CTO博客开发 一步步踏入Linux世界 煮酒品茶 濛sir的积累 老男孩linux运维 龙哥 Smile 抚琴煮酒 大浪淘沙 温水煮青蛙 何秉昆De技术博客 浩子的▁运维笔录ヽ 见 linux---基础篇 个人随写 与I...

Anonymous123
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
5
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
9
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
7
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
10
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部