四层架构下读操作原生查询应该放在哪个层级?
读场景原生查询的层级归属判断
这两种放置方式都有合理的场景,核心取决于你的架构模式和查询本身的属性,判断逻辑如下:
- 首先明确四层架构的核心职责边界
- 基础设施层负责封装所有技术实现细节,屏蔽数据库、中间件等外部依赖的差异,和具体业务流程无关
- 应用层负责编排业务用例的执行流程,不承载核心业务规则,只协调各组件完成请求处理
- 如果你采用了CQRS模式做读写分离,读操作直接返回前端所需的DTO,没有领域逻辑、也不会被多个业务用例复用:这种情况原生查询放在应用层是合理的,也是eShopOnWeb这类项目的实践逻辑。这类查询本身只服务于单个特定的业务用例,放在应用层可以避免在基础设施层定义大量零散的查询接口,调整查询字段、关联逻辑时不需要跨层修改,迭代效率更高。
- 如果你的原生查询会被多个用例复用,或者查询本身需要内置通用的领域规则(比如全局软删除过滤、租户权限过滤、敏感数据过滤):这种情况应该把查询实现放在基础设施层,通过仓储接口对外提供能力,应用层只负责调用,保证通用规则的统一维护,避免逻辑散落在多个用例里出现不一致。
实操建议
- 不管放在哪一层,都不要把SQL硬编码在业务流程代码里,建议用单独的常量类、或者对应ORM的查询封装组件存储SQL语句,方便统一维护。
- 如果项目的复杂读查询占比很高,可以单独抽离独立的查询层,和写操作的领域逻辑完全隔离,后续维护会更清晰。
内容的提问来源于stack exchange,提问作者truonglx
相关产品推荐
相关产品推荐

