动易cms 2007的新特性中有这样一个非常重要的特性:
以下是引用片段: 支持多数据库 动易cms 2007采用了抽象工厂模式将各个不同数据库的实现方式分离,理论上可以支持任意的数据库,目前测试的版本只支持ms sql 2000/2005。 不同数据库的实现分离,就不用象原动易cms 2006版那样为了兼容ac和sql两种数据库,必须使用标准sql语句,并要注意两种数据库语句中的细小差异。分离后,各数据库实现独立出来,就可以灵活的利用各数据库的优点(如:ac中可以使用sql语句,而sql中就可以灵活使用存储过程、自定义函数、触发器等特性),并且互相之间没有干扰,可通过配置文件来实现快速切换。 |
这个新特性,我在上篇讲n层架构设计的文章中已经附带了讲了一下。今天我们再来详细的讲一讲,动易是如何实现这个特性的。
实现这个特性的前提是系统采用分层架构设计,然后在数据访问层采用数据库抽象工厂模式,将不同数据库的实现抽象出来,然后通过修改配置文件,即可在不同数据库类型间切换。
可能有些人迷糊了:动易cms2006不也支持access和sql两种数据库吗?还有其他的系统不也是这样吗?这怎么能称得上是动易cms 2007的新特性呢?呵呵,大家别急,且听我慢慢讲来。
动易cms2006是支持access和sql两种数据库,并且也是简单的修改conn.asp中的数据库类型即可在access和sql中切换。但是动易cms2006的多数据库实现方式与动易cms2007是完全不同的。
我们先来看看动易cms2006的多数据库实现方式。我们来看一段动易cms2006的源代码:
conn.execute ("alter table pe_admin add adminpurview_" & rschannel("channeldir") & " int null")
else
conn.execute ("alter table pe_admin add column adminpurview_" & rschannel("channeldir") & " integer")
end if
因为access和sql在语法上稍微有些区别,并不能完全通用,所以在写程序时就要特别注意两者的区别,一不小心,就会出现错误。而且这种方式,在写代码时,要考虑到每一种数据库的不同语法之处。每增加一种数据库,就要重新修改几千处查询语句,工作量可想而知,而且在修改时极易出错。
动易cms2007则采用了全新的模式——数据库抽象工厂模式。在数据访问层(dal)中,采用dal interface抽象出数据访问逻辑,并以dal factory作为数据访问层对象的工厂模块。对于dal interface而言,分别有支持ms-sql的sql server dal和支持oracle的oracle dal具体实现。而model模块则包含了数据实体对象。其详细的模块结构图如下所示:
数据访问层的模块结构图
在数据访问层中,完全采用了“面向接口编程”思想。抽象出来的idal模块,脱离了与具体数据库的依赖,从而使得整个数据访问层利于数据库迁移。dalfactory模块专门管理dal对象的创建,便于业务逻辑层访问。sqlserverdal和oracledal模块均实现idal模块的接口,其中包含的逻辑就是对数据库的select,insert,update和delete操作。因为数据库类型的不同,对数据库的操作也有所不同,代码也会因此有所区别。
此外,抽象出来的idal模块,除了解除了向下的依赖之外,对于其上的业务逻辑层,同样仅存在弱依赖关系,如下图所示:
业务逻辑层的模块结构图
上图中bll是业务逻辑层的核心模块,它包含了整个系统的核心业务。在业务逻辑层中,不能直接访问数据库,而必须通过数据访问层。注意图中对数据访问业务的调用,是通过接口模块idal来完成的。既然与具体的数据访问逻辑无关,则层与层之间的关系就是松散耦合的。如果此时需要修改数据访问层的具体实现,只要不涉及到idal的接口定义,那么业务逻辑层就不会受到任何影响。毕竟,具体实现的sqlserverdal和oracaldal根本就与业务逻辑层没有半点关系。
上述的三个模块分别使用了三个独立的项目来进行管理,编译后就生成了三个相应的dll,如下图所示:
注意,在测试版中,因为还没有提供对access和oracle的数据库支持,所以在上图中我们没有看到对应的powereasy.accessdal.dll和powereasy.oracledal.dll。