基于SLIM API 4的项目中非数据库类repository是否合规及是否应拆分服务
架构设计问题解答
关于Repository的定义边界
Repository的核心定位是外部资源读写的抽象层,并不强制绑定数据库交互:所有对接外部存储(包括数据库、FTP/OSS对象存储、第三方存储接口)的逻辑都可以放在Repository层,你当前用Repository封装SSH2/FTP通信的设计思路本身是符合规范的。
不符合规范的点是你在这个Repository中混入了图片缩放、压缩、旋转等业务处理逻辑,Repository层应该只做纯资源交互,不包含和存储无关的业务处理代码。
合理的拆分方案
你可以按单一职责原则做三层拆分,既符合分层规范,也不会产生过多冗余类:
- 拆分纯存储操作:保留
FileStorageRepository,仅封装FTP连接、文件上传/下载/删除等和远程服务器交互的逻辑,不包含任何图片处理、业务规则代码 - 抽取通用工具类:将图片缩放、压缩、旋转等和存储无关的通用能力,抽为无状态的
ImageProcessor工具类,可供所有需要图片处理的业务模块复用 - 上层Service编排逻辑:新增
FileService,依赖FileStorageRepository和ImageProcessor,处理具体的业务流程:比如接收上传文件后先调用图片处理类生成符合要求的尺寸,再调用存储Repository上传到FTP指定路径,最后返回访问地址
关于Service数量过多的顾虑
不需要提前担心Service数量过多的问题,你可以按业务域聚合Service:所有和文件、图片相关的业务逻辑都可以放在同一个FileService中,不需要为每个小功能单独创建Service。如果后续业务迭代复杂度上升,再按需按子场景拆分即可,前期不需要做过度设计。
分层架构核心原则参考
你当前用的action/service/repository分层的核心边界可以参考以下规则,避免后续出现职责混乱的问题:
- Action层:仅处理HTTP请求的参数接收、校验、调用对应Service、封装响应结果,不包含任何业务逻辑
- Service层:封装业务规则、负责多工具/多资源调用的编排,不直接对接外部资源
- Repository层:仅封装对外部资源的读写操作,无业务逻辑
内容的提问来源于stack exchange,提问作者William Frid
相关产品推荐
相关产品推荐

