为啥我们需要在单独的服务层中编写业务逻辑而不是在控制器本身中编写?

Posted

技术标签:

【中文标题】为啥我们需要在单独的服务层中编写业务逻辑而不是在控制器本身中编写?【英文标题】:Why we need to write business logic in separate service layer instead of writing in controller itself?为什么我们需要在单独的服务层中编写业务逻辑而不是在控制器本身中编写? 【发布时间】:2019-01-27 06:06:29 【问题描述】:

创建不同的层有什么用,即业务逻辑实现的服务层,而不是在控制器本身中实现业务逻辑

【问题讨论】:

因为它是一个很好的实践 阅读 MVC 设计模式 @franiis 这个问题很不适合那里,原因与这里相同。请不要推荐您不熟悉的网站。另请参阅:What goes on Software Engineering (previously known as Programmers)? A guide for Stack Overflow 【参考方案1】:

这是因为关注点分离。 在 Controller 中,它主要对处理传入的 http 请求并响应该请求感兴趣。我们担心与处理与给定沟通渠道相关的事情有关的事情。

您可以公开一个rest api以及soap api,或者您可能有各种格式的int,您希望共享数据。商业逻辑本身并不关心您如何将这些数据传达给最终用户。所以你把它拿出来放在一个只处理商业逻辑的公共地方,而控制器类只调用它。然后,您可以让休息控制器和肥皂控制器通过同一条 biz 逻辑代码响应请求。

您在控制器中所做的是验证请求调用服务并以您希望将其公开给调用者的方式处理异常。

【讨论】:

这是一个非常好的答案Anunay。我不清楚的是为什么业务逻辑需要在一个单独的项目中。会不会不在 API 项目中而只是封装在不同的类中?谢谢【参考方案2】:

这取决于您的架构。如果您使用一些领域驱动设计原则,那么控制器/api 中几乎没有任何逻辑。控制器将用于协调/管理域服务(即 AccountService)、存储库(即 AccountRepo)和/或基础设施服务(即 EmailService)之间的通信。所有逻辑都在模型和服务中。一些优点是... 1. 可单元测试的代码 2. 代码更好地模拟业务问题(控制器对业务问题没有任何意义) 3. 控制器不会成为将大量业务逻辑塞入其中并导致混乱的地方 4. 还有更多...

当然,这一切都取决于可维护性是否是优先事项

【讨论】:

以上是关于为啥我们需要在单独的服务层中编写业务逻辑而不是在控制器本身中编写?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我们的项目需要接口层/抽象类? [关闭]

Jalo 层与服务层

称为包含业务逻辑的应用程序服务

清晰架构(Clean Architecture)的Go微服务: 事物管理

N 层服务层验证显示表示层中的业务逻辑错误

为啥业务逻辑应该从 JSP 中移出?