posts - 257, comments - 1336, trackbacks - 63, articles - 8
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

        古人云:温故而知新。在讨论新的数据访问模式之前,我们先来回忆一下上一篇Post中提到的Data Accessor模式吧。
        Data Accessor提供了一种解耦合的策略:将数据库访问的细节进行逻辑抽象并封装于单一组件中,从而降低数据访问和数据模型之间的耦合性
。对于应用程序而言,它并不了解具体的数据访问操作,如建立数据库连接和执行SQL语句等,但是它仍然了解数据模型的具体结构,譬如数据表名和某一数据表的列名等。因此,应用程序虽然脱离了数据访问的烦恼,但仍然与数据模型紧密耦合在一起。如果数据模型发生改变,或者数据模型的建立并非通过静态描述即可完成的,都会令应用程序不得不面临大范围的改动。在这个时候,Active Domain Object(主动域对象,以下大部分地方简称ADO)模式就可以大展身手了。
        ADO模式的实质很简单,就是将数据模型的细节也封装在单一组件中,对应用程序仅公开与业务逻辑相关的通用操作。我们之所以把这样的对象称为Active,正是因为对象本身包含了数据模型和与业务逻辑相关的数据访问操作,而不仅仅是数据的载体(如果将数据访问的代码剥离,那么Active Domain Object就会退化成Domain Object/Value Object)。从这个角
度出发,上一篇Post中给出的代码已经无意中使用了与ADO十分类似的模式:

public class UserDAO extends DAOSupport {
    
private Connection conn =
 getConnection();
        
}

根据自己参与过的一个项目的经验,UserDAO中可以包含很多与业务逻辑相关的方法,例如getVIPUser等。如果UserDAO本身包含了User的属性,并将UserDAO改为User,UserDAO摇身一变就成为了一个Active Domain Object变体。但是这样的UserDAO并非是一个纯粹的Active Domain Object,因为其包含的逻辑操作并不是通用的操作。通常,定义在一个Active Domain Object的通用操作主要有四个方面

        1、初始化(Initialize):读取一个或多个数据表以初始化Domain Object的内容;
        2、刷    新(Refresh):当数据表发生更新之后,通过这样的操作以更新Domain Object的内容;
        3、保    存(Save):将Domain Object内容的改变持久化至数据表中;
        4、列    表(List):根据查询条件获得所需的单个Domain Object或者Domain Object集合。

有了这样四个方面的操作,我们可以将应用程序中的业务逻辑看作是若干个Active Domain Object的若干次通用操作的组合体。在这样的前提下,应用程序的业务逻辑将会更加的清晰,而便于维护。同时将应用程序和数据模型解耦合了,即使数据模型发生了改变,应用程序的改动也将会是很小的。
        ADO模式的思想很好理解,但是要建立一个满足应用程序需求的Active Domain Object就并非易事了,会有很多问题需要考虑:譬如,Domain Object的创建是否仅仅以单表作为依据呢?还是需要建立与联接表对应的Domain Object呢?Domain Object的属性是不是就简单的引入一个表中的所有列呢?对应用程序而言,仅仅是逻辑操作是可见的,那么Active Domain Object封装的与逻辑操作相关的数据访问性能是否足够好呢?诸如这类问题都是在设计和实现Active Domain Object的时候要深思熟虑的。

[1]  参考书籍:《数据访问模式——面向对象应用中的数据库交互》

Feedback

#1楼    回复  引用  查看    

2005-07-26 21:04 by neuhawk      
.net用DAO以后,事务怎么处理,用com+吗?

#2楼    回复  引用    

2005-07-26 22:31 by idior [未注册用户]
@neuhawk
现在只能用com+,不过.net2.0对事务有更好的支持。

#3楼 [楼主]   回复  引用  查看    

2005-07-27 08:50 by FantasySoft      
两位老大在说DAO呢? 我觉得ADO与DAO之间有相似之处,但是却不能划等号。ADO偏重Domain Object,里面包含的操作仅是很通用的几种数据操作;而DAO则偏重Data Access,通常会在其中包含与业务逻辑密切相关的数据操作,而且会跟Value Object一起使用。

整体感觉DAO + VO = Super ADO。之所以Super,因为DAO会包含更多的数据操作。

#4楼    回复  引用    

2005-07-27 13:38 by idior [未注册用户]
◎FantasySoft
不管是哪个都要考虑事务的处理啊。

#5楼 [楼主]   回复  引用  查看    

2005-07-27 14:22 by FantasySoft      
idior老大: 事务当然是要考虑了,只是看到neuhawk提到了DAO,就罗嗦了两句。:) 不过,我倒是有点纳闷,使用了DAO模式之后,事务处理的方式会有所改变吗?

#6楼    回复  引用  查看    

2005-07-27 15:00 by neuhawk      
如果业务层直接对数据库操作,可以通过控制连接事务实现。
如果使用dao,实现共享事务较麻烦,用com+就比较方便了,但个人
觉得com+部署比较麻烦,如果不用com+,实现跨层的事务又较麻烦。

象spring那样,让容器管理事务,那就多舒服,虽然com+不错,但感觉有点重。

#7楼    回复  引用  查看    

2005-07-27 15:36 by idior      
@FantasySoft
使用DAO的事务,参考一下这个吧.
http://idior.cnblogs.com/articles/195193.html
可别叫我老大, 愧不敢当.

@neuhawk
用Spring内部还是用的JTA. 如果想要Spring那样方便的配置功能,spring.net可没有,倒是可以试试castle.你可以关注下ado.net2.0对事务的改进.

#8楼 [楼主]   回复  引用  查看    

2005-07-27 15:50 by FantasySoft      
To idior老大:呵呵,还是忍不住要这样叫你。

我没有在.NET中玩过Transaction,只是在原来的J2EE项目中用过。

那个时候使用的Transaction要么比较原始:基于JDBC的,也就是通过Connection提供的commit和rollback来完成一个事务的界定;要么就比较高级:使用CMP,将事务交给Container来搞定。

至于JTA Transaction,就只停留在了解概念上面了。 :P

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-07-26 18:15 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: