整洁架构下表现层、业务层、数据层依赖注入与耦合问题咨询
三层整洁架构实现问题解答
问题1解答
将单例的数据层执行器注入到表现层,确实会打破你预设的P->B->D依赖流向规则
无论注入的对象是不是单例,只要表现层直接引入了数据层的组件,就会产生表现层直接依赖数据层的非法流向,跳过了业务层的逻辑约束,后续数据层的修改会直接影响表现层代码,不符合三层架构的设计初衷。
问题2解答
你的判断是正确的,仅做层间抽象不使用DI,依然会存在紧耦合问题。
如果上层代码依然在内部直接实例化下层的具体实现类,定义的抽象完全没有起到解耦作用,你依然无法在不修改上层代码的前提下替换下层实现(比如把正式环境的Repository替换为单元测试用的Mock实现),本质上还是强绑定了具体实现,属于紧耦合。
问题3解答
会导致层间紧耦合
业务层直接引用数据层的具体依赖(比如你代码里直接new UserRepository的操作),意味着业务层直接绑定了数据层的具体实现,而不是依赖数据层对外暴露的抽象接口,后续只要需要替换数据层实现,就必须修改业务层代码,违反了依赖倒置原则,确实属于紧耦合。
现有代码优化建议
你贴出的代码核心问题就是上层在内部直接实例化下层的具体实现,没有用到抽象的解耦能力:
// 现有问题代码 public class ViewModel<T> extends GenericRouter { IPresentation ip = new BusinessUseCaseImpl(); } public abstract class BusinessUseCase<T extends HashMap> implements IPresentation<T> { UserRepository urepo = new UserRepository(); }
可以按如下逻辑调整:
- 数据层先定义抽象接口
IUserRepository,让UserRepository实现这个接口 - 业务层只依赖
IUserRepository抽象,移除内部new的操作,改为通过构造函数传入实例 - 表现层同理只依赖
IPresentation抽象,实例通过构造函数传入 - 所有具体实现的实例化统一放到最外层的初始化逻辑/DI容器中处理,层内只和抽象交互
内容的提问来源于stack exchange,提问作者wipesax360
相关产品推荐
相关产品推荐

