我是Sping Boot 的新手,我正在创建一个没有UI的RESTful API。我在想,我是应该使用业务服务并从那里调用存储库,还是直接从我的REST控制器调用存储库?
axzmvihb1#
关注点分离是关键:
***控制器(表示层,或端口)**是一个协议接口,它将应用程序功能暴露为RESTful Web服务。它应该做到这一点,仅此而已。***仓库(持久层,适配器)**抽象持久化操作:查找(通过id或其他条件),保存(创建,更新)和删除记录。它应该做这些,而不是更多。*服务层(域)包含了您的业务逻辑,定义了您提供哪些功能,如何访问,传递和获取什么-独立于任何端口(可能有多个端口:Web服务、消息队列、预定事件)并且独立于其内部工作(服务是否使用存储库,甚至数据在存储库中如何表示都不关任何人的事)。服务层可以从存储库数据进行1:1转换,或者可以对其他数据进行过滤、转换或聚合。
业务逻辑可能一开始很简单,只提供简单的CRUD操作,但这并不意味着它将永远保持这种状态。一旦需要处理访问权限,就不再是将请求从控制器直接路由到存储库的问题,而是检查访问和过滤数据。请求在到达数据库之前可能需要验证和一致性检查。可能会应用规则和其他操作,因此您的服务会随着时间的推移而获得更多价值。即使对于简单的CRUD情况,我也会引入一个服务层,它至少可以从DTO转换为实体,反之亦然。
**保持你的控制器/存储库(或端口和适配器)愚蠢,你的服务聪明,你得到一个可维护和良好测试的解决方案。
vbopmzt12#
服务层不是Sping Boot 独有的概念。它是一个软件架构术语,经常被称为模式。简单的应用程序 * 可能会跳过 * 服务层。实际上,没有什么能阻止您从控制器层调用存储库方法。但是,我强烈建议使用服务层,因为它主要是为了定义应用程序边界。服务层的职责包括(但不限于):
引用Martin Fowler的Catalog of Patterns of Enterprise Application Architecture:服务层从接口客户端层的Angular 定义了应用程序的边界及其可用操作集。它封装了应用程序的业务逻辑,控制事务并协调其操作实现中的响应。
2条答案
按热度按时间axzmvihb1#
关注点分离是关键:
***控制器(表示层,或端口)**是一个协议接口,它将应用程序功能暴露为RESTful Web服务。它应该做到这一点,仅此而已。
***仓库(持久层,适配器)**抽象持久化操作:查找(通过id或其他条件),保存(创建,更新)和删除记录。它应该做这些,而不是更多。
*服务层(域)包含了您的业务逻辑,定义了您提供哪些功能,如何访问,传递和获取什么-独立于任何端口(可能有多个端口:Web服务、消息队列、预定事件)并且独立于其内部工作(服务是否使用存储库,甚至数据在存储库中如何表示都不关任何人的事)。服务层可以从存储库数据进行1:1转换,或者可以对其他数据进行过滤、转换或聚合。
业务逻辑可能一开始很简单,只提供简单的CRUD操作,但这并不意味着它将永远保持这种状态。一旦需要处理访问权限,就不再是将请求从控制器直接路由到存储库的问题,而是检查访问和过滤数据。请求在到达数据库之前可能需要验证和一致性检查。可能会应用规则和其他操作,因此您的服务会随着时间的推移而获得更多价值。
即使对于简单的CRUD情况,我也会引入一个服务层,它至少可以从DTO转换为实体,反之亦然。
**保持你的控制器/存储库(或端口和适配器)愚蠢,你的服务聪明,你得到一个可维护和良好测试的解决方案。
vbopmzt12#
服务层不是Sping Boot 独有的概念。它是一个软件架构术语,经常被称为模式。简单的应用程序 * 可能会跳过 * 服务层。实际上,没有什么能阻止您从控制器层调用存储库方法。
但是,我强烈建议使用服务层,因为它主要是为了定义应用程序边界。服务层的职责包括(但不限于):
引用Martin Fowler的Catalog of Patterns of Enterprise Application Architecture:
服务层从接口客户端层的Angular 定义了应用程序的边界及其可用操作集。它封装了应用程序的业务逻辑,控制事务并协调其操作实现中的响应。