为什么我们需要服务层?

Ree*_*eed 10 spring design-patterns spring-boot

我目前正在学习Spring Boot,我已经看到人们如何创建控制器,注入服务类以及在服务类中注入存储库.

为什么我们需要将服务类作为中间人?为什么我们不能将存储库注入控制器?

这是困扰我的教程:https://www.youtube.com/watch?v = lpcOSXWPXTk&list = PLqq-6Pq4lTTbx8p2oCgcAQGQyqN8XeA1x

Plo*_*log 8

您并不总是需要服务层.特别是如果您的API只是简单的CRUD操作,例如,没有真正的逻辑或计算.

但是,如果您有一个在查询存储库之前执行某些逻辑的API,那么这应该位于单独的服务类中.这是由所谓的单一责任原则引起的良好做法.

https://en.wikipedia.org/wiki/Single_responsibility_principle

  • 您的控制器的唯一责任应该是处理传入的请求.
  • 服务层的唯一责任是执行Controller接收的数据所需的任何逻辑.
  • 存储库的唯一职责是查询数据库.


gly*_*ing 8

这种争论通常支持分层架构:

我们使用层来允许我们抽象出底层实现,以便我们可以轻松地更改它。

分层的一个令人愉快的副作用是——如果忠实地遵循——它可以通过(a)使用接口来定义每一层和(b)鼓励关注点分离,从而使系统更具可测试性。

所以,这就是原则(至少简而言之),但与任何原则一样,它可能会被误解和误用。

虽然在大多数情况下分层隐藏视图层的数据访问(反之亦然)的好处是可靠的,但在视图层和数据层之间包含服务层的好处并不总是那么引人注目。一个系统具有...

  • 少量控制器
  • 少量的存储库
  • 控制器和存储库之间的 1:1 映射
  • 不需要域表示(对于存储库)和视图表示(对于控制器)之间的复杂转换

...可能不需要服务层。

然而,一个具有...

  • 大量控制器和存储库
  • 控制器和存储库之间的复杂关系,例如,控制器可能使用多个存储库并组合它们的结果或在链中调用这些存储库
  • 域表示(用于存储库)和视图表示(用于控制器)之间的复杂转换

...可能确实需要一个服务层。