DDD架构的应用中,图像处理相关逻辑应当放在哪一层?
落地拆分方案
你现有代码混了三类不同职责的逻辑,拆解开分别对应DDD的不同层级即可,不需要硬套实体/值对象的概念:
1. 先拆分逻辑边界
你现在的代码里有三类完全独立的逻辑:
- 核心业务规则:按指定宽度等比缩放、清除EXIF信息、固定JPEG质量75导出,这些是你业务中约定好的图片处理规范,和存储、上层调用方无关,属于通用业务逻辑
- 持久化逻辑:将图片数据写入数据库、按ID和尺寸查询图片流,这部分和你用的SQL Server、EF Core强绑定,属于技术实现细节
- 流程编排逻辑:加载原始图片→生成4种规格→组装数据→入库的完整执行流程,属于上层用例的执行逻辑
2. 对应分层放置
- 图片处理核心规则放通用领域服务
不需要做独立的Image实体,直接在领域层定义无状态的IImageProcessingDomainService通用领域服务,SaveImage这类纯图片处理逻辑都放到这个服务的实现里,不掺杂任何持久化、流程控制代码。所有需要调用图片处理能力的领域都可以复用这个服务,规则统一,修改时只需要调整一处。 - 持久化逻辑放基础设施层
在领域层定义IImageRepository仓储接口,基础设施层做对应的ImageRepository实现,你现有代码里的GetImageData、新增图片入库的逻辑都封装到这个仓储实现里,所有和数据库相关的操作都收拢到这一层,上层不需要感知存储介质的细节。 - 流程编排逻辑放应用服务
原来的Processor方法里的流程控制逻辑,放到应用层的ImageAppService里,只做协调工作:接收输入参数→调用领域服务生成4种规格的图片字节数组→调用仓储持久化数据,不实现任何业务规则。
额外优化建议
你现在GetImageData方法里直接拼接size参数到SQL有注入风险,建议先校验size参数是否是允许的几个枚举值,再拼接SQL,或者改成参数化的查询逻辑。如果后续有迁到对象存储的可能,还可以再抽一层存储抽象,进一步解耦业务逻辑和存储实现。
内容的提问来源于stack exchange,提问作者Varto
相关产品推荐
相关产品推荐

