数据访问对象(DAO)和仓储库模式有何区别?我正在使用企业Java Beans(EJB3)、Hibernate ORM基础设施以及领域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术开发应用程序。
数据访问对象(DAO)和仓储库模式有何区别?我正在使用企业Java Beans(EJB3)、Hibernate ORM基础设施以及领域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术开发应用程序。
如果我们考虑设计模式DAO和Repository的原始定义,它们看起来非常相似。主要区别在于字典和来源(Oracle vs. Fowler)。
引用:
DAO - “将数据资源的客户端接口与其数据访问机制分离”和“DAO实现了与数据源一起工作所需的访问机制。数据源可以是持久存储,如RDBMS,外部服务,如B2B交换,存储库,如LDAP数据库,或通过CORBA Internet Inter-ORB协议(IIOP)或低级套接字访问的业务服务。”
Repository - “使用类似集合的接口介于域和数据映射层之间,以访问域对象。”和“从概念上讲,Repository封装了存储在数据存储中的对象集和对它们执行的操作,提供了更面向对象的持久性层视图。Repository还支持实现域和数据映射层之间的清晰分离和单向依赖的目标。”
基于这些引用,设计模式都在域层和数据层之间进行通信。此外,Repository与ORM相关联,而DAO则是一个更通用的接口,用于从任何地方访问数据。
DAO(数据访问对象)并不总是明确与仅数据库相关联,
它可以只是访问数据的接口,这里的数据可以从DB/Cache或甚至REST(这些天不太常见,因为我们可以轻松地将它们分离在各自的Rest / IPC客户端中)中访问,
在这种方法中,Repo可以由任何ORM解决方案实现。如果底层Cache / Repo更改,则不会传播/影响服务/业务层。
DAO可以接受/返回域类型。考虑到学生域,相关的DAO类将是StudentDao。
StudentDao {
StudentRepository,
StudentCache,
Optional<Student> getStudent(Id){
// Use StudentRepository/StudentCache to Talk to DD & Cache
// Cache Type can be the same as Domain Type, DB Type(Entities) should be a Same/Different Type.
}
Student updateStudent(Student){
// Use StudentRepository/StudentCache to Talk to DD & Cache
// Cache Type can be the same as Domain Type, DB Type(Entities) should be a Same/Different Type.
}
}
DAO可以接受/返回子域类型。考虑一个学生域,它有一个子域,比如出勤/科目,将有一个DAO类StudentDao。
StudentDao {
StudentRepository, SubjectRepository, AttendanceRepository
StudentCache, SubjectCache, AttendanceCache
Set<Subject> getStudentSubject(Id){
// Use SubjectRepository/SubjectCache to Talk to DD & Cache
}
Student addNewSubjectToStudent(ID, Subject){
// Use SubjectRepository/SubjectCache to Talk to DD & Cache
}
}