现在的位置: 首页 > 综合 > 正文

RFID会议签到系统总结(七)――数据访问

2011年11月24日 ⁄ 综合 ⁄ 共 3430字 ⁄ 字号 评论关闭

 

数据访问是所有要与数据库打交道的系统的最基础模块,也是在当今开发领域中提供现成解决方案最多的。其中一方面当然是各位开发者的习惯性思维,几乎每一位有追求的程序员都不会写出令自己摇头的代码,总是力求使系统的实现接近于自己的“理想”,而数据访问由于数据库的多样性及数据库SQL语法与现今流行的OO思想不适配,给予了程序员们以很大的发挥空间,所以造就了此领域的“百花齐放”;另一方面则是世界事物的复杂性,使各式各样的解决方案好像都无法胜任,所以“轮子”就越造越多。

鉴于项目的特性,表不会很多,但系统对性能有一定的要求。第一时间排除了各种重量级的解决方案。曾试图在公司内部寻找有无可以稍微减少一点劳动力的工具或是参考,但徒劳无功,最后还是自己动手。虽然化了点时间,但还是有不少收获。

虽然说是自力更生,但还是建立在别人的已有的成果上的。数据访问的最低层的东西当然还是ado.net,基于这上面我从Enterprise LibraryDAAB里提取出了核心部分的代码,根据数据库的配置方式(系统的配置可以见上二篇)重写了生成DataBase部分,并去除了一些对于项目用途不大的功能。经过了上述的改造,与数据库打交道的部分算是完成,这样既保持了DAAB原来对于ado.net的封装,又显得比较的轻巧。

数据访问模块与数据库打交道的部分不费什么力气,但模块向应用端开放的部分颇费心思。最简单的方法当然就是直接基于Typed DataSet向外提供接口,Typed DataSet无疑在应用上来讲比常规的DatSet是要友好的,而且在IDE里生成Typed DataSet也很省力。但在.net 1.1时代,基于DataSet的开发实在是说不上很完美,写起代码来啰啰嗦嗦不说,在Typed DataSet之外,我们还无法万事大吉,还要为此写一个增删改查的类来操作,数据库有个变动呢,重新生成一下Typed DataSet还特费事。为此最终我并没有完全用DataSet的方式来开放数据访问的接口。

最后成型的东西是借鉴了园子里tintownSPLSPL是个很好用的数据访问框架,以前自己曾用来为同学写过一个项目的DEMO,很管用,那个项目后来没有成,但由此留下了印象,这一次鉴于项目的特性没用它),在实体类上通过实现IDataAccess接口,集成了它的增删改查等基本操作,与此同时对于如GetAll之类的方法除了返回实体集合外也返回了DataTable这样的方式,每个实体类定义了对应数据表名、主键以及各个字段的常量。此外也实现了一个的condition来简化查询(或更新,删除)时的条件定义,当然这里写的东西没有人家那么通用,这一块基本就是需要什么实现什么。最后为了以后管控端数据窗体时便于提取公共操作,为每一个实体类实现了一个索引器。

这样的设计说不上很好,数据操作部分没有由于更多时间把它提取到外头来形成一个基础层,而是通过Template Method的方式散落在各处,类代码看起来比较的庞杂。好在所有的代码都是自动生成的,即使散落各处也比较好管理(只要管理那个代码生成器就行了),重要的是现在所有跟数据库密切相关的代码都在同一组代码文件中。某一数据表更改后,我很容易重新生成实体类,用代码生成器维护实体类也比在IDE里维护Typed DataSet轻巧,不会给你出一些莫名的问题。

这一部分的设计自己回头看看不是非常满意,但现在回顾一下觉得这也许是当时那种情况下最合适的选择。

 

这里在实现方面没有什么可以特别提的地方,主要就是用上各种抽象方法、虚方法,用Template Method的模式。

只稍微说一下在实现condition时的一个细节,在外部运算符枚举值与内部运算符字串之间的转化上,根据网上的一些提示,在枚举定义时加了一个Attribute,运行时利用反射技巧取出字符串。这里记一下实现方式。

描述枚举的Attribute

抱歉!评论已关闭.