剖析 .Net 下的数据访问层技术(三)

u ** O/R Mapping **

O/R Mapping 的全称是: Object Relational Mapping ,主要目的是在传统 RDBMS 与 OO Language 之间建映射关系,从而使开发人员彻底脱离 数据持久 这片剪不断理还乱的苦海。

关于 O/R Mapping 或者近来比较热门的 O/X Mapping (大家可以参考 ** “程序员, ** ** 2004.01 ** ** , ** ** P86 ** ** ”) ** ,可能需要专门的文章进行详细论述,本文的目的主要是对现有方案的优缺点进行简单剖析以及提供一些实践中的参考信息。

相比较 J2EE 平台, .NET 下的 O/R Mapping 可谓没什么历史,至今还尚未有经过考验的成熟的可用方案。但是,随着各大厂商的重视以及开源项目的如火如荼, .NET O/R Mapping 的步伐也开始慢慢跟上,使这块本属于 J2EE 的领地加入了新的竞争对手(会不会使更多的开发人员投入 .NET 阵营? J ),也让众多疲于在 SQL Clause 或 ADO.NET 中来回奔命的 DAL 开发人员看到了“光明之路”。

接下来,就让我们一起看看在这片比 ADO.NET 更广阔的土地上有些什么值得探讨的 Solution 。

Ø ** Open Source **

开源方面一直与 .NET 保持一定距离, O/R Mapping 更是寥寥无几,但就作者的下载试用和源码分析来看,个人以为如下的两个解决方案还是有一定参考价值的: ** OPF ** , ** OJB ** 。

有关这两个开源项目的简介,大家可以参考 ** “程序员, ** ** 2004.01 ** ** , ** ** P13 ** ** ” ** 。

OPF 的全称是: ** O ** bject P ersistent F ramework 。

OJB 的全称是: ** O ** b J ect Relational B ridge 。

在实现手法上,这两个方案的思路完全不同,具有各自的代表性。

OPF 走的路线有点类似于 Typed DataSet 或 Borland ECO (请参考下面的介绍),实现比较简单, 提供更多的源码级控制 ;而 OJB 的实现则类似于 Microsoft ObjectSpaces (请参考下面的介绍), 采用了配置文件 的方式,相对就比较复杂了。

这两个方案的基本框架如下所示:

OPF :

从图中不难看出:

(1) Persistent 类扮演了 DataSet 的角色,除了常规的对象数据操作外,还可以设定不同对象间的关系(如主从关系,集合关系等,这一点在 Borland ECO 所生成的代码中也可略见一二),这也是上文所说“ 提供更多源码级控制 ”的原因所在;

(2) PersistentSqlDataManager 则扮演了 DataAdapter 的角色,通过预先设置的 Commands 来执行真正的数据库操作;在实际撰写的 employee data manager 中,开发人员确实需要提供基本的 SQL 语句,就像在 SqlCommond 中设置的那样( Borland ECO 则更进一步,以 OCL 代替了 SQL );

(3) ObjectBroker 的作用非常重要,它是对象与数据间的桥梁, RegisterPersistent 方法建立了这种 虚拟 ( Object )与 现实 ( RDBMS )间的 关系

(4) 在 employee business object 的声明中,对象属性与数据库字段的对应关系是通过 .NET Attribute 机制体现的,所以修改起来还是比较方便的,虽然相比配置文件的方式显得不够灵活(请参考 OJB 的介绍) , 比如:需要重新编译,开发人员不得不关注数据库字段等。

OJB :

从图中不难看出:

(1) 该方案的实现比较复杂,但用户需要实际撰写的代码变少了(只需要编写 employee business object ),这其中的关键就在于引入了 配置文件 ;同时,由于配置文件的引入,我们在 hello world application 中也不需要调用类似 OPF 解决方案(请参考上文的 OPF 类图)中的 RegisterObject 方法,所有这一切(甚至包括数据库连接信息),系统都已了如指掌!

(2) 该方案中, SQL 命令通过 Criteria 类被彻底替代,而 QueryFacade 则充当了 Adapter 的功能,通过 PersistenceBroker 这一真正的 Command 与数据库进行通信;

(3) 无论是 repository.xml 配置文件,还是 Criteria 、 QueryFacade 类,我们都可以在 ObjectSpaces (请参考下面的介绍)中找到类似的实现(难道是巧合?),同时,作者个人以为,这种方式也 更符合 ** O/R Mapping ** 的精神,减轻了开发人员的负担!

(4) OJB 还有一个非常 cool 的工具“ repositorygen.exe ”,可以用来生成 repository.xml 配置文件(同样的,源码无偿奉上 J ),这一点,甚至连 ObjectSpaces 都没能做到(想想那么多字段、属性、关联、映射,简直可以让人发疯 J )!

** 作者简介: ** ** **

“ 本文作者张雪峰 是 毕博全球开发中心 的高级开发工程师。他目前在中国上海 毕博全球开发中心 Core/EAI 部门工作,从事 .NET 技术的研究以及相关项目的开发。可以通过 [email protected] 与他联系。 ”

Published At
Categories with Web编程
Tagged with
comments powered by Disqus