旷野亮光 2012-12-11
在做Winform项目的时候,一直有一个梦想,就是希望把所有的组件模块组合即可组装成一个完整的项目系统(或者至少可以大部分完成)。这即使是梦想,我也一直为之奋斗,每前进一步,我们离梦想就靠近一步。因此,本着这个梦想,我一路走来,开发整理了一系列的组件模块,包括底层的公用类库、Winform分页控件、通用的适应多数据库的查询组件,以及相对高层次一点的组件模块:通用权限管理系统、通用字典管理模块、通用程序自动更新模块、以及本篇随笔介绍的通用附件管理模块,当然还会有更多的组件模块会吸引我继续朝着梦想前进。除了这些,为了提高开发效率,从设计好的数据库,直接生成项目代码,从05年开始至今,一直完善我的代码自动生成工具 Database2Sharp。下面的附图,是我对于目前Winform开发框架以及将来的发展规划,朝着梦想前进,用博客园记录我的前进轨迹以及感想。
本片随笔,还是落地生根,继续介绍我的Winform开发框架中的一环,通用附件管理模块。该模块其实是很通用的一个模块,例如我们的一些日常记录,可能会伴随着有图片、文档等的附件管理,如果为每个业务对象都做一个附件管理,或者每次开发系统都重新做,那么效率肯定没有直接采用通用的附件管理那么方便快捷了。而且在日益增多的项目管理中,我们不需要维护一大堆相同或者类似的代码,而且我的组件都是内置支持多数据库的,对不同的数据库,只需要适当配置即可正常使用,对于组件化的基础性平台以及支持多数据库等方面,特别是项目管理等方面,颇具争议及传奇色彩的园友,吉日嘎拉在文章《分享从带头拼死拼活开发软件项目到不去现场异地坐镇远程遥控照样可以把上海的软件项目管理好》就有很好的阐述,其实他这些总结很实在,有着很好的基础基类(自己构建的或者购买的)总比从头来过的强,术业有专攻,更是厚积薄发积累的体现。
1、多数据库支持模块
我的一贯做法,就是所有的模块,为了应付未知的项目需求,都做成多数据库支持的,虽然看似麻烦了一点,但是由于我提炼的框架,数据库访问类都高度抽象化及完好的封装,因此即使增加多种数据库的支持,其实需要调整的地方极少。
对于上面几种数据库的支持,一般来说,需要增加不同数据库类型的BaseDAL,由于每个不同数据库都需要拥有一个BaseDAL,那么很多相同的操作代码就会发生冗余,因为大多数数据库的基础操作是一样的,只有一部分比较特别,需要进行个性化处理,因此对数据访问层进行优化设计,得到下面的设计图,如下所示。
经过框架抽象,这个BaseDAL类代码很少,基本上通用的数据库操作,已经放到了AbStractBaseDAL超级基类进行封装,即使对于一些不同数据库操作不同,我们也尽可能抽象放到上面基类了,BaseDAL只需要实现一些特殊的操作即可。
2、模块控件化,最大化降低开发工作
为了减少重复开发,要求控件尽可能考虑实际的需求情景。一般来说,我们在数据编辑界面,会有两个需求,一个是管理与数据记录对应的附件列表,一个是维护自己的附件信息,下面对这两个需求进行描述和讲解。
1)管理与数据记录对应的附件列表
首先我们创建一个独立的控件,用于放到编辑数据记录窗口里面,如下所示。
这样在项目中集成(如数据编辑窗口),直接拖动这个控件到界面中,运行就可以看到下面的效果了。
由于一般创建记录的时候,给他指定一个GUID的附件组ID,这样我们在数据记录保存前,我们就可以上传附件了,如下所示。
而且在这个过程中,可以随时查看自己在该记录中已经上传的附件。
如果附件不够,可以随时启动上传操作,附件支持多选文件,然后一次性,启动后台线程操作方式,把文件上传及附件记录保存到数据库,界面如下所示。
2)维护自己的附件信息
有时候,我们需要管理自己的个人附件,还需要知道自己在业务模块中上传过哪些附件,这两个是比较常见的场景,这样我们开发一个界面来管理查看这两类附件,就可以满足大多数的要求了,如下所示。
因为个人附件或者业务附件都可能比较多,甚至随着业务的增长,数量可能激增,那么分页就很有必要,如上图下发就是利用我的分页控件模块(纯分页控件模块,不含列表),这个分页控件集合是我博客介绍得比较多的一个控件来的,而且这个是其中之一的纯分页控件,可以适用于所有分页的场景,而不仅仅是用来显示二维表这么简单。当然,这个纯分页控件的使用也是简单易用的,可以用在各种需要分页显示的场合中,这个ListView就是其中之一,还可以用在图片展示等更多场景。
3、集成图片查看控件
由于是附件管理,因此有可能上传各种文件,包括Word文档、Excel文档、压缩文件,以及各种类型的图片,因此为了方便对图片的查看,这个控件集成了图片查看控件,可以非常方便直接读取图片附件的数据流作为对象展示,该图片控件支持对图片的滚动放大缩小、左右翻转、选择放大、图片移动、保存图片等功能,不需要查看,直接使用ESC退出即可。
当然对于其他不是图片的格式附件,由于不知道或者很难直接查看,因此提示用户保存到本地然后提示打开查看即可,如下所示。
4、集成到WCF开发框架中
为了最可能、最大程度的体现系统界面的一致性和应用完备性,我也开发了适用于WCF开发框架的附件上传模块,这样就可以在更多的开发场合上使用,而且由于附件管理模块的集中化,更加方便维护代码了。
其实WCF开发框架模式下的附件管理更有意义,因为如果是纯粹的本地文件管理,可能体现不出网络化的附件管理优势,这样通过WCF的架构,所有的附件数据都可以在各个不同的地方、各个不同的网络环境下进行访问,分布式的优势更加明显,这也是WCF开发框架的相同优势。
以上就是我对附件管理模块的封装,希望朝着WInform业务模块组件化、最终产品高度定制化的理想前进,以最快的速度搭建好最终产品,以高稳定性和统一性的组件界面或者客户的信赖和赞许。