spring-boot应用程序中服务层的用途是什么?

问题描述 投票:0回答:2

我是Spring引导和创建没有UI的RESTful API的新手。

我正在考虑是应该使用业务服务并从那里调用存储库,还是直接从我的REST控制器调用它的存储库?

spring spring-boot model-view-controller
2个回答
2
投票

简单应用程序可以跳过服务层。实际上,没有什么可以阻止您从控制器层调用存储库方法。

但是,我强烈建议使用服务层,因为它主要是为了定义应用程序边界。服务层的职责包括(但不限于):

  • 封装业务逻辑实现;
  • 集中数据访问;
  • 定义交易开始/结束的位置。

引用马丁·福勒的Service Layer pattern

服务层从连接客户端层的角度定义了应用程序的边界及其可用操作集。它封装了应用程序的业务逻辑,在其操作的实现中控制交易和协调响应。


1
投票

关注点分离是关键:

  • 控制器(表示层或端口)是一个协议接口,将应用程序功能公开为RESTful Web服务。应该做到这一点,仅此而已。
  • 存储库(持久性层或适配器)抽象持久性操作:查找(通过id或其他条件),保存(创建,更新)和删除记录。应该做到这一点,仅此而已。
  • 服务层(域)包含您的业务逻辑。它定义了您提供的功能,如何访问它们以及传递和返回的内容-取决于任何端口(其中可能有多个:Web服务,消息队列,计划的事件)并且不依赖于其内部工作方式(服务使用存储库,甚至数据在存储库中的表示方式都与谁无关)。服务层可以从存储库数据转换1:1,或者可以应用附加数据的过滤,转换或聚合。

业务逻辑可能从一开始就很简单,并且提供的CRUD操作不多,但这并不意味着它将永远保持这种状态。一旦您需要处理访问权限,就不再是将请求从控制器直接路由到存储库的问题,而是检查访问和过滤数据的问题。在访问数据库之前,可能需要对请求进行验证和一致性检查,并且可能会应用规则和其他操作,因此您的[[服务会随着时间的推移获得更多价值]]即使对于简单的CRUD案例,我都会引入一个服务层,该服务层至少从DTO转换为Entities,反之亦然。

使您的控制器/存储库(或端口和适配器)保持愚蠢,并使您的服务更智能,您将获得可维护且可测试的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.