【问题标题】:Why do we need service layer?为什么我们需要服务层?
【发布时间】:2018-03-08 15:23:57
【问题描述】:
【问题讨论】:
标签:
spring
spring-boot
design-patterns
【解决方案2】:
这种争论通常支持分层架构:
我们使用层来允许我们抽象出底层实现,以便我们可以轻松更改它。
分层的一个令人愉快的副作用是 - 如果忠实地遵循 - 它可以通过 (a) 使用接口来定义每一层和 (b) 鼓励关注点分离,从而使系统更具可测试性。
所以,这就是原则(至少简单地说),但就像任何原则一样,它可能会被误解和误用。
虽然分层以隐藏视图层的数据访问(反之亦然)的好处在大多数情况下是可靠的,但在视图层和数据层之间包含一个服务层的好处是并不总是那么引人注目。一个系统...
- 少量控制器
- 少量存储库
- 控制器和存储库之间的 1:1 映射
- 无需在域表示(对于存储库)和视图表示(对于控制器)之间进行复杂的转换
...可能不需要服务层。
然而,一个具有...的系统
- 大量的控制器和存储库
- 控制器和存储库之间的复杂关系,例如也许一个控制器使用多个存储库并组合它们的结果或在链中调用这些存储库
- 域表示(用于存储库)和视图表示(用于控制器)之间的复杂转换
...可能确实需要一个服务层。
【解决方案3】:
这是一种将服务功能与传输分开的方法,您的服务定义了一个涵盖单一职责 (SOLID) 的功能,并且可以使用不同的端口(六角架构)公开,例如 HTTP/REST 或 AMQP。
添加服务层让您可以灵活地在未来更改端口,或使用多个端口。
【解决方案4】:
就是这样,你不必在 RestController 层中放很多代码,它应该是干净的,并且只包含与通信相关的代码。
所以所有的逻辑和 IF 等都应该留在 Controller 层。
Repository层应该坚持interface的方式,方法里面不应该有任何代码,只有数据获取方式的布局,而不是它的逻辑。
【解决方案5】:
Spring 引导控制器是一个与外部世界的接口,例如与 UI 没有太大区别。
就像您希望能够拥有一种以上的 UI 风格一样,您的业务逻辑可能会有多个界面。特别是如果您希望它长期存在并适应未来的 API 框架。
如果您的逻辑嵌入在控制器中,那么当您到达该点时,您必须进行相当多的重构。
所以需要一个单独的控制器取决于你的逻辑的复杂性。