DAO和Repository有什么区别

banq说过DAO和Repository其实是一个东西,我在看jivejdon3的时候看到Repository把数据库访问委托给了DAO来实现。为什么Repository不直接实现数据库访问呢?他们俩不是一个东西吗?而在很多应用层里都直接使用了DAO而不是Repository,这是为什么?

现在也有不少新的开源永Repository替代DAO了,Repository封装了DAO,还有一些装配工作,把数据装配成一个完整的对象。如果直接使用Hibernate就无需划分了

能 具体说说嘛 ?

我怎么 感觉 Repository是 负责 对象的创建和查询后对象的组装的呢......
为什么要替代Dao呢

总感觉他们的职责是不同的....
Dao只负责CRUD基本操作......而Repository则负责更复杂的对象的查询....可能需要Dao的支持....因而可以持有Dao的引用....可终究他们的职责是不一样的啊...

>现在也有不少新的开源永Repository替代DAO了,Repository封装了DAO,还有一些装配工作,把数据装配成一个完整的对象。如果直接使用Hibernate就无需划分了

这个意思是Repository关联DAO配合完成操作,还是Repository职责就是DAO的职责?

Repository是对象的仓库,也就是保存对象的地方,这个仓库就是我们普通意义的仓库,一个真正OO系统,业务层是围绕活动的对象进行,活动的对象是从仓库中获取的,也是通过交给仓库进行对象长久保管,也就是持久化意思,说白了,就是保存到数据库。

而DAO则没有如此OO概念,DAO是Data access Object,DAO中有数据概念,还是没有摆脱数据库的影子。

所以,Repository替代DAO,是OO深入的趋势,但是在具体处理中,由于性能或设计不够周到或者一些事情把握不定,DAO还会继续存在一段时间,属于过渡式消失。

Repository和DAO两个概念比较中发现,Repository是相对对象而言,而DAO是相对数据库而言,只要我们还是使用关系数据库保存对象,也可能这两者都同时存在,因为侧重点不一样,但是可以肯定的是,业务层应该直接和Repository打交道,而不是DAO.

以上是我个人认识。

>但是在具体处理中,由于性能或设计不够周到或者一些事情把握不定,DAO还会继续存在一段时间,属于过渡式消失。

这个意思是不是DAO可以使用DAO缓存代理来提高性能,而Repository不可以直接使用缓存,因为Repository直接使用缓存会使业务层搞的复杂,所以有些要求高性能的设计时是使用Repository调用DAO的代理缓存?

一般情况下Repository有没有接口?

To:Bang

您认为的仓库是否有自己寻找对象的能力呢?

打个比方,当仓库被 new 的时候,他是不是要在数据库当中找寻自己的货物(指对象)呢。

然后提供给客户端寻找货物的一种方法或者多种方法。

>您认为的仓库是否有自己寻找对象的能力呢?
仓库和工厂一般配合在一起使用,工厂用来创建对象,不过是从仓库中。

>这个意思是不是DAO可以使用DAO缓存代理来提高性能,而Repository不可以直接使用缓存

我认为对象缓存放在DAO中不合适,而是在Repository中,Repository=对象工厂+对象缓存+DAO 是这样一个组成。

JiveJdon3中将缓存放在DAO中现在觉得不恰当。以后会更改。

DAO主要的工作是负责对象的存取,不应该将对象的管理放在DAO中。
而Repository除了可以存取对象外,还应包括对对象的管理。
我个人认为:Repository = 对象的管理 + DAO。
对象的管理如:对象缓存,对象在Repository的状态等。

哦,学习中~~呵呵

bang我觉得对象工厂不应该在repository里面。

我总觉得从领域服务当中应该有对象工厂创建之后把它存入到Repository当中

比较优雅而且合乎情理。

你觉得呢?

我觉得Dao只负责数据库操作,不需要操心数据完整性等的约束,而我们的仓库就需要关心数据的完整性了,在仓库调用Dao进行数据库操作时,要保证数据完整性不要受到破坏。不知道这样对不对?

比方说dao,它拿回来的是一个(一些)ResultSet类型,它里面有一些sql,这是个领域人员无法理解的东西,他们根本就不知道这东西有什么用,直到你向他解释这里面包含了账单的所有东西,他们仍然一脸茫然的看着你。
但repository就不一样了,你可以清楚的,没有任何歧义的告诉他,我拿回来的是一批账单,并且所有与账单相关的东西都在这里了,他们更乐意听到这种他们听得懂的话。

咬文嚼字的话

DAO是对象访问接口类
接口类=方法的管理类
就是操作数据库的具体方法的类
User
UserDAOImpl 就是管理怎么把User对象存进取出数据库的具体方法的类


repository是对象仓库类
仓库类=对象的管理类

User
UserRepository 就是管理怎么样才能有效的访问User类的类


UserRepository在必要的时候才调用UserDAOImpl去操作数据库

你也可以吧UserRepository理解为UserCache,当然Repository不仅仅是cache的功能

DAO和Reposirtory在DDD里面都不属于一层的,怎么会是一个东西?

简单的例子就是如果你有一个Model Object包含着一些Value Object,那么每个Object都回有相应的一个DAO,因为DAO都已经告诉你叫作Data access object,所以,每一个object都需要一个dao来做数据库等地层数据处理。

Reposirtory是对每一个Model Object来说的,一个Reposirtory基本上对应一个Model Object.

比如Person 包含一些Value Object比如address, work 等等,那么
Person就有一个Reposirtory,它里面有相关的方法比如,只是单纯的取出一个Person,然后Load相关的address和work在需要的时候,因为,有时候你不需要一次把所有的Value Object在一个Model Object提取的时候都一次性提出来,那样子叶增加系统负担也会造成资源浪费。

不知道明白了么?

还不明白?说白了就是Model Object有Reposirtory而Value Object没有,Value Object的基本操作可以用Dao而DDD有明确说明一般所有的对象操作都要面向的是Model Object。