整洁架构中UI层到Infra层存在编译时依赖代表什么含义?
整洁架构UI层到Infra层编译时依赖的含义
首先明确三层的基础定位:
- Core层为业务核心层,仅存放领域逻辑、业务规则与对外依赖的抽象接口,编译时不依赖任何外层模块
- Infra层为基础设施实现层,是Core层定义的仓储、第三方服务等抽象接口的具体实现,比如数据库操作实现、消息队列接入实现等,编译时仅依赖Core层
- UI层为入口交互层,负责处理前端请求、参数校验、响应封装等,标准设计下编译时仅依赖Core层
UI层到Infra层存在编译时依赖,具体代表以下含义:
- UI层的代码中直接引用了Infra层的具体实现类,而非仅依赖Core层定义的抽象接口。最常见的场景是在UI的业务代码(如Controller、Service)中直接实例化Infra层的实现类,而非通过依赖注入注入Core层的抽象接口
- Infra层的代码变更会直接影响UI层的编译结果:只要Infra层修改了实现类的方法签名、删除了某个类,哪怕Core层的抽象接口完全没有变动,UI层的代码也会直接编译报错
- 这种设计违反了整洁架构的依赖倒置原则:整洁架构要求所有编译时依赖必须向内指向核心层,同属外层的UI层和Infra层之间不应该存在直接的编译时依赖,避免业务核心被外层实现的变动影响
- 唯一的例外场景是将UI层作为DI容器的组合根:仅在UI层的启动注册文件中引用Infra层的实现类完成DI注册,业务代码完全不触碰Infra层的实现,这种场景下的编译时依赖是可接受的,且影响范围可控
- 存在该依赖的情况下,部署时只要修改了Infra层的代码,就必须重新编译UI层才能让变更生效;而标准的无编译依赖设计下,仅需要替换Infra层的编译产物即可,不需要重新编译UI层
内容的提问来源于stack exchange,提问作者variable
相关产品推荐
相关产品推荐

