Clean Architecture/DDD:用例如何初始化实体?最佳方案探讨
《Clean Architecture》中用例初始化实体的最佳实践
根据Uncle Bob《Clean Architecture》的核心定义,系统核心由**Entities(核心业务规则)和Use Cases(用例对象)**构成:用例负责建模与实体交互的业务流程,但实践中会遇到两个核心矛盾:
书中明确禁止将实体作为参数传入用例类;但如果每个用例的输入都包含实体初始化的全部数据,当实体新增参数时,所有复用该实体的用例输入都要修改,维护成本极高。
针对这个问题,以下是符合Clean Architecture原则的最佳解决方法:
1. 引入实体工厂(Entity Factory)
- 定义独立的实体工厂类,将实体的初始化逻辑从用例中剥离,专门负责实体的实例化
- 用例只需向工厂传递自身业务流程所需的必要数据(而非实体全量参数),由工厂根据实体的构造规则完成创建
- 当实体参数变更时,仅需调整工厂的创建逻辑,所有依赖该实体的用例无需修改输入结构
2. 采用分层输入DTO设计
- 摒弃为每个用例单独定义全量实体输入DTO的方式,设计分层的DTO结构:
- 基础DTO:包含实体初始化的通用必填字段,作为所有相关用例输入的基础
- 扩展DTO:针对特定用例的额外业务字段,继承基础DTO
- 实体参数变更时,仅需更新基础DTO的结构,所有继承它的扩展DTO自动同步变更,避免逐个修改用例的输入定义
3. 基于依赖反转原则抽象实体创建接口
- 定义
IEntityFactory抽象接口,声明实体创建的标准方法,用例仅依赖该接口而非具体的工厂实现 - 具体的工厂类实现该接口,负责实体的实际初始化逻辑
- 这种设计完全符合Clean Architecture的依赖规则(核心层不依赖外层实现),同时彻底隔离实体变更对用例层的影响

内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

