.NET开发已有不少年月,刚入行时,公司没有使用任何第三方框架,都是使用.NET原生态类库,.NET有什么就用什么,所有的代码都需要技术人员敲出来,包括数据操作、界面逻辑处理,每个CRUD基本都要从0写起,更换项目时最多copy一下,但也需要调整很多的地方;界面层的数据使用的是DataTable数据集,使用了DataTable,就避免不了类似于DataRow[字段名]或者DataRow[字段索引]这样的代码,由于项目在开发初期一般都无法把需求确定完整,后期的修修改改在所难免,那么数据表结构调整后,项目中的“字段名”、”字段索引”都需要调整,这是一项简单而繁琐的工作,需要细心、耐心和恒心,能把这个简单的事件做的毫无纰漏,那就相当伟大了。现实情况一般技术人员都很难做到,导致bug不断冒出,至于原因,大家都懂的。本着偷懒、统一、简化的想法,DevNet的1.0.0.0第一版,对数据层的封装就此诞生。
数据层关系图:
这是目前DevNet框架的数据层封装的类关系图的简化版,从上图中可以看到该数据层支持SQLServer、Oracle、OleDB、MySql、SQLite数据库,其中SQLite数据库的处理有一点区别,我会单独描述。
其中DBConnect类和ScriptQuery两个类是对数据底层操作的封装类,便于开发人员方便使用;DBConnect封装了对数据底层的操作,ScriptQuery使用参数模式对SQL脚本进行了封装,使得技术人员可以使用面向对象的方式写SQL脚本,当然目前DevNet框架对于简单的CRUD已经不需要再单独写代码了,我会具体描述。
该数据层的封装,可以理解为类似于SqlHelper类,是对数据访问提供的一个帮助类库,有了这个类库,接下来就需要对界面层DataTable数据对象的改造,很自然就想到了用实体模式,也参考了网上很多对实体的封装,这里要感谢bluedoctor大侠的实体封装设计方案,在此引用www.pwmis.com/sqlmap/,表示感谢。
实体类关系图:
.jpg) |
该实体有IEntityBase接口和EntityBase基类组成,接口定义了实体映射表的基本信息,表名、主键、自增型字段,EntityBase实现了该接口,包含了字段属性的设置、获取及相关属性的事件。
本实体模式使用const常量来定义字段名称、表名称、主键字段、自增型字段,减少了字符串占用的内存,提高了运行性能
有关实体性能等我会在实体接口与基类说明中详细描述 |
代码生成器:
有了实体基类,与数据表字段对应的实体子类,如果都要全部手写的话,这个工作量可不小,而且很枯燥,代码生成器自然就出现了;网上有很多代码生成器,譬如:CodeSmith、动软代码生成器等等,这些生成器比较成熟,功能也很强大,但无法用在我的实体架构中,它们的模板功能也许可以实现,本人为研究,于是参考了网上多个生成器,自己也弄了个生成器,直接生成实体类、DAL类、BLL类、Search查询类,这下可以不用手写实体等一些简单代码了;下载地址:
DevNet代码生成器下载
写到这里,项目基本的开发工具都有了,数据底层的封装,实体的改造,代码生成器的辅助工具,对项目的帮助可以说已经是很大了;但是,我上面说了,简单的CRUD呢,到这里为止,项目还是需要写一些简单的CRUD代码,重复代码很多,伤神、伤力啊,IT人员可伤不起啊!于是数据层和逻辑的封装也出现类。
数据层和逻辑层的封装:
这里贴上DataManager和BLLManager的类图

这里使用了.NET的泛型技术对数据层与逻辑层进行了封装,两层相对独立,互不依赖;它们包含了常用的CRUD的方法,每个方法都有一定的重载,也包括操作Relaion关系表的方法,以实现在同一个连接、同一个事务中对多个关系表的数据进行操作。
DataManager数据抽象基类有几个条件参数的方法重载,其中条件是以泛型TCondition类传入的,对于复杂的查询,根据项目实现这几个方法即可,另外这里也包含了在CUD操作的事件,用于特殊情况的处理,还包含了SQLMapper映射机制。
BLLManager提供了灵活的异常捕获处理,错误日志的处理,提供了强大的扩展能力,可根据实际项目随意调整。
至此,DevNet框架形成了一个整体架构,包括数据层,实体层、逻辑层及代码生成器工具,在这期间也参考了Nhibernate及IBatis等成熟的.NET框架,当然与它们还有差距。DevNet更倾向于项目实际开发,是一套轻量级的ORM及SQLMapper组件,提供安全、稳定、高性能的开发架构,让广大的技术人员脱离枯燥的代码,全力的关注项目的业务逻辑处理,提升项目的可维护性、可扩展性!