英文:
Spring MVC - Separation of logic RestController and Service
问题
我开始使用Spring MVC来构建我的第一个REST API 现在我在一些逻辑放在哪里方面遇到了一些困难。我阅读了以下内容:
@RestController
:处理请求,定义用户可以使用的API
@Service
:包含业务逻辑
@Repository
:抽象了对数据库的访问
在一个简单的第一个示例中,我看到流程是这样的:RestController调用Service,Service调用Repository。在第一步中,我是这样做的。
现在我想使用ResponseEntity
- 我听说这是一个好习惯。但现在我开始疑惑:Service层应该返回ResponseEntity
还是领域模型的实例呢?
为了说明我的意思(是的,我是个铁杆足球迷):
@GetMapping("/clubs")
public ResponseEntity<List<FootballClub>> getAllClubs(@RequestParam String footballLeague) {
List<FootballClub> clubs = service.getAllClubs(footballLeague);
return new ResponseEntity(...);
}
像这样做是最佳实践,还是让Service返回ResponseEntity
?我是Spring MVC的新手。我在Stackoverflow上阅读了一些文章,其中一些解释了一般的设置。但我找不到如何处理例如ResponseEntity
的方法。
我认为你可以提出ResponseEntity
也应该在Service中,因为你可能需要返回不允许的方法或类似的内容,确定是返回不允许的方法ResponseEntity
还是一个OK的实体,这被认为是业务逻辑的一部分。但我不太清楚。
谢谢!
英文:
I started using Spring MVC to build my first REST API Now I struggle a bit of where to put which logic. I read the following:
@RestController
: Handles requests, defines the API the user can use
@Service
: Contains the business logic
@Repository
: Abstracts away from access to DB
In an easy first example, I saw the flow was like this: RestController calls Service, Service calls Repository. In the first step, I did it like this.
Now I want to use ResponseEntity
- I hear it is good practice to use that. But now I start wondering: Should the service layer return ResponseEntity
or just the instances of the domain model?
To show what I mean (yes, I am a big football fan):
@GetMapping("/clubs")
public ResponseEntity<List<FootballClub>> getAllClubs(@RequestParam String footballLeague) {
List<FootballClub> clubs = service.getAllClubs(footballLeague);
return new ResponseEntity(...);
}
Is it best practice to do it like this or to let the Service return the ResponseEntity
? I am new to Spring MVC. I read some articles on Stackoverflow and some explain the general setup. But I could not find how to deal with for instance ResponseEntity
.
I think you can argue that ResponseEntity
should also be in Service as you might need to return method not allowed or something like this and determining whether to return a method not allowed ResponseEntity
or an OK Entity could be considered part of the business logic. But I don't know.
Thank you!
答案1
得分: 2
> Short Answer
是的,应该更倾向于返回领域对象的 Service
,而不是返回 ResponseEntity<>
的 Service
。
> Long Answer
并没有固定的最佳实践。尽管如此,你应该考虑实现类似于六边形架构或分层架构的方式。在六边形架构中,应用程序/领域逻辑被限制在应用程序/领域层中,与表示层、持久化/基础设施层分开。在应用程序层中定义接口(称为端口),在基础设施层提供实现(称为适配器)。这方面有一篇优秀的文章进行了阐述。
诸如 Service
、Repository
的概念来自于领域驱动设计(DDD)。想要了解更多关于DDD的信息,可以查阅 Vaughn Vernon 的书籍 实现领域驱动设计。
英文:
> Short Answer
Yes, Service
returning domain object should be preferable to a Service
returning ResponseEntity<>
.
> Long Answer
There is no best practices. Having said that, you should think of implementing something like Hexagonal or Layered architecture. In Hexagonal architecture, application/domain logic is confined in application/domain layer which is separated from presentation, persistence/infrastructure layer. Interfaces are defined in application layers (called ports) and implementation is provided in infrastructure layer (called adapters). There is an excelled article on this.
Concepts like Service
, Repository
is taken from DDD
. To know more about DDD you can check Vaughn Vernon book Implementing Domain-Driven Design.
答案2
得分: 1
这项服务应该返回领域模型的实例。ResponseEntity(与控制器在请求处理后返回的响应相关)应该在控制器层级创建。
英文:
The service should returns instances of the domain model. The ResponseEntity (which is related to the Response the controller returns after request elaboration) should be created at controller level.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论