Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns DAO(数据访问对象)最佳实践——我看到的示例都使用DAO和服务对象,这里的最佳实践是什么?_Design Patterns_Dao - Fatal编程技术网

Design patterns DAO(数据访问对象)最佳实践——我看到的示例都使用DAO和服务对象,这里的最佳实践是什么?

Design patterns DAO(数据访问对象)最佳实践——我看到的示例都使用DAO和服务对象,这里的最佳实践是什么?,design-patterns,dao,Design Patterns,Dao,我正在创建一个数据访问对象,用于从Google App Engine检索基于Spring框架构建的web应用程序的信息(这是第一次) 我看到了许多使用Controller/webapp->Service->DAO->JDO/googleapp引擎模式的示例 在这种模式中,DAO层是唯一了解JDO的层,因此,如果数据存储发生更改,该层是唯一需要更换的层。服务层调用DAO层并格式化/处理所需的数据 我的问题是为什么需要额外的服务层?至少在一开始,服务层似乎没有给等式增加太多内容。我自然会认为只需编写

我正在创建一个数据访问对象,用于从Google App Engine检索基于Spring框架构建的web应用程序的信息(这是第一次)

我看到了许多使用Controller/webapp->Service->DAO->JDO/googleapp引擎模式的示例

在这种模式中,DAO层是唯一了解JDO的层,因此,如果数据存储发生更改,该层是唯一需要更换的层。服务层调用DAO层并格式化/处理所需的数据

我的问题是为什么需要额外的服务层?至少在一开始,服务层似乎没有给等式增加太多内容。我自然会认为只需编写一个DAO层来封装JDO请求,并操作和返回数据


有人能告诉我一个单独的服务层的合理性吗?当项目变得更大、更复杂时,这会变得明显吗?

通常你会将DAO放在服务层中,因为当你的应用程序变得更复杂时,你会在服务中做一些有用的、非琐碎的事情。例如,您可以使用多个DAO协调复杂的数据操作。服务层还提供API边界,用于划分交叉关注点,如事务管理、授权检查、性能日志记录等

将功能抽象到服务中的另一个好处是它促进了可重用和可维护的组件。当您开始时,您可能只对呈现一些html感兴趣。您编写了一个加载一些数据的服务,并在服务层(表示层)之上的层中处理html部分。现在,您想要建立一个RESTful Web服务。可以重用您的服务层来加载数据;您所要担心的就是您的webservice端点返回的json或xml(当然还有REST语义)


因此,对于简单的情况,服务层可能不会增加多少,但随着应用程序的扩展,它们变得有价值,甚至对保持代码整洁至关重要。

是的,最初服务层似乎没有给等式增加多少。但你可以这样想

服务层=表示层和业务层之间的层

您一定知道,在层之间分离关注点总是好的。您的服务层可以映射到不同的业务领域、表示层,而不必担心如何使用DOA层

您可以将其视为其他两个层之间的边界,在本例中是表示层和业务层之间的边界。表示层中的代码通常实现用例。典型的用例是用户执行的一系列操作,这些操作导致一个或多个业务对象、工作流和服务之间的交互。服务层允许您使用中间API抽象这些较小的交互,中间API通过更粗粒度的服务公开。表示层对层中的一个服务进行一次调用。调用的服务层方法将协调业务层中的对象和工作流,以实现所需的行为

安全问题

  • 我确实在服务堆栈周围创建了一个安全层。这将帮助我识别用户的真实性并访问给定的服务
  • 我也有一个围绕服务层定义的事务层,它告诉数据库引擎在成功执行后返回时提交在服务层中所做的更改 如果您正在定义应用程序的层,这些事情也需要关注