Architecture DAO模式的最佳实践?

Architecture DAO模式的最佳实践?,architecture,domain-driven-design,design-patterns,dao,Architecture,Domain Driven Design,Design Patterns,Dao,我见过很多代码使用服务dao模式,我不知道这种模式的起源。它强制前端层调用服务,然后将一些服务任务委托给dao 我想问: DAO层是否只执行与数据访问相关的任务?那么异常封装之类的事情呢 是否有其他模式可以替代此模式或优于此模式 我认为pojo域模型和事务脚本使得即使是简单的问题也变得复杂,有可能完全消除dao层吗 这样一个层的主要目标是提供持久性后端的抽象。然而,大多数情况下,由于持久性后端的特殊性,完全隐藏是不可能的;一个典型的例子是查询处理。要使用hibernate查询数据库,您将编写某种

我见过很多代码使用服务dao模式,我不知道这种模式的起源。它强制前端层调用服务,然后将一些服务任务委托给dao

我想问:

  • DAO层是否只执行与数据访问相关的任务?那么异常封装之类的事情呢
  • 是否有其他模式可以替代此模式或优于此模式
  • 我认为pojo域模型和事务脚本使得即使是简单的问题也变得复杂,有可能完全消除dao层吗

  • 这样一个层的主要目标是提供持久性后端的抽象。然而,大多数情况下,由于持久性后端的特殊性,完全隐藏是不可能的;一个典型的例子是查询处理。要使用hibernate查询数据库,您将编写某种查询代码(使用HQL、查询API等)以及使用JCR、BigTable或其他工具时的完全不同的范例。因此,大多数情况下,这种模式都失败了

    此外,还有一个更烦人的DAO/DTO问题。然后,为了层隔离,您需要编写一个保存数据的第一个类,然后编写第二个从第一个类复制数据,而不需要任何附加值

    然而,在这一领域已经做了一些工作。对于我为GoogleAppEngine启动并实现的一个微框架,我已经制作了一系列所谓的dao框架来简化这个相当普通的代码


    请注意,我计划在将来通过gaedo服务定义提供完全的透明度,但这只是一个希望;-)(我想这对您来说不是很重要)。

    理想情况下,DAO层“抽象”了对某些数据存储系统(数据库、文件系统、LDAP目录等)的访问。因此,从这个意义上讲,它只用于与数据访问相关的任务。但是,您也可以有一个DAO层来访问web服务或应用程序外部的其他组件。这是关键,它提供了对一些外部组件的访问


    其主要思想是,DAO层没有可以转移到更高层(隔离)的实现细节。考虑这一点的一个很好的起点是:如果我计划替换DAO层提供访问的组件(例如数据库),我需要做什么?例如,您在XML文件中有一些数据,并且计划将这些数据迁移到数据库中

    假设您有各种与XML相关的异常,这些异常都脱离了DAO层。然后,将XML层迁移到数据库层变得非常困难。然而,如果封装了DAO层的所有实现细节,这将变得容易得多


    最后,它是关于代码的可维护性。您对特定层(服务、DAO等)的实现细节的依赖性越小,代码的可维护性就越好。

    对数据的访问因数据源而异。对持久性存储(如数据库)的访问因存储类型(关系数据库、面向对象数据库、平面文件等)和供应商实现的不同而有很大差异

    使用数据访问对象(DAO)来抽象和封装对数据源的所有访问。DAO管理与数据源的连接以获取和存储数据


    DAO实现处理数据源所需的访问机制。数据源可以是RDBMS之类的持久存储、B2B交换机之类的外部服务、LDAP数据库之类的存储库,或者是通过CORBA Internet-Inter-ORB协议(IIOP)或低级套接字访问的业务服务。依赖DAO的业务组件使用DAO为其客户机公开的更简单接口。DAO对其客户机完全隐藏数据源实现细节。由于DAO向客户机公开的接口在底层数据源实现更改时不会更改,因此此模式允许DAO适应不同的存储方案,而不会影响其客户机或业务组件。本质上,DAO充当组件和数据源之间的适配器。

    “如果我计划替换组件(例如数据库),我需要做什么?”-如果我没记错的话,这是关于三层体系结构中的数据访问层(Fowler)@Riduidel:我在哪里可以得到关于你的gaedo设计的文档?浏览给定的博客,有一些信息散布在各种消息中。您可以转到gaedo博客主页()并浏览列表以获得完整概述。如果有什么不足,请毫不犹豫地发送消息!本文的其余部分如下: