You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clean Architecture中Repository(数据库网关)分层与跨边界规则疑问

关于Clean Architecture实践中Repository放置与跨边界传值问题的解答

针对第一个疑问:Repository接口的合理放置层级

把Repository接口声明在Entities层是不符合Clean Architecture原书设计逻辑的,将其定义在Application(用例)层才是正确的做法,原因非常直接:

  • Entities层的唯一职责是封装跨应用复用的、无任何外部场景绑定的核心企业业务规则,这一层的代码完全不应该感知“持久化”“UI交互”“第三方调用”这类和具体应用场景绑定的概念。举个很直白的例子:同一个Order订单实体,在C端电商交易系统中需要持久化存储,但在一个纯本地运行的订单金额核算工具里根本不需要持久化能力,如果把OrderRepository接口放在Entities层,等于给所有复用该实体的场景硬塞入了和核心业务无关的持久化抽象,破坏了Entities层的纯粹性。
  • 很多示例都搞错了依赖倒置原则里“接口归属调用方”的规则:Repository接口的直接调用者是Application层的用例逻辑,而非Entities层的实体本身,接口的所有权属于调用方,因此自然应该定义在距离调用方最近的Application层。这种实现下,Adapters层的持久化实现只需要依赖Application层定义的Repository接口完成实现,依赖链路为Adapter → Application → Entities,完全符合依赖向内的规则,根本不会出现绕过Application层的问题。

针对第二个疑问:跨边界传递实体对象是否违规

你提到的这类实现确实违反了Clean Architecture的跨边界传值规则。
原书“What data crosses the boundaries”小节的核心要求非常明确:跨架构边界传递的只能是孤立的、无业务逻辑的简单数据结构(比如普通DTO、基本类型构成的结构体),绝对不允许直接传递实体对象,原因有二:

  • 实体是封装了核心业务逻辑的内层对象,如果外层(持久化Adapter、Controller、第三方接口适配层)直接持有实体引用,无法从机制上避免外层代码直接调用实体的业务方法,绕开Application层的用例流程管控,让架构边界彻底失效。
  • 一旦外层直接依赖实体对象,后续为了适配ORM映射、JSON序列化、协议转换等外层需求,开发人员往往会被迫给核心实体加上外层依赖的注解、无参构造、非业务字段,直接违反“依赖永远指向内层”的核心规则。

注意:网上大量标注为Clean Architecture实践的示例都做了简化,甚至存在作者本身对规则理解有偏差的问题,判断实现是否合规的唯一标准永远回到原书的两个核心约束:1. 所有代码依赖必须指向更内层的抽象;2. 内层代码绝对不能感知任何外层存在的概念、数据结构或实现逻辑。


内容的提问来源于stack exchange,提问作者felipeaf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:09:21