Spring Boot DDD架构中实体的正确存放位置咨询
关于DDD四层架构的理解纠正与补充
你的整体框架理解方向是对的,但有几个细节需要修正和补充:
- 表现层:除控制器和DTO外,还应包含请求/响应校验逻辑、前端交互适配逻辑(如视图模型),核心是处理外部请求接入与响应输出,不涉及任何业务逻辑。
- 应用层:核心是编排业务流程,而非直接执行业务逻辑。它负责调用领域层的领域服务或聚合根方法完成业务动作,处理DTO与领域对象的转换,协调多仓库或外部服务调用,本身不承载核心业务规则。
- 领域层:除实体、聚合根、仓库接口外,还需包含领域服务(处理跨聚合业务逻辑)、值对象、领域事件、业务规则(如规格模式)。这是架构核心,所有业务规则必须在此实现,完全独立于数据库、框架等外部依赖。
- 基础设施层:除仓库实现、配置、工具外,还包含数据库连接、ORM封装、外部API调用、消息队列集成等,是所有外部依赖的具体实现层,为领域层、应用层提供技术支撑。
实体的正确放置方式
实体必须仅存于领域层,这是DDD的核心原则:
- 领域实体是承载核心业务规则的载体,定义完全由业务需求驱动,与数据库类型、ORM等技术实现无关。若在基础设施层放置实体,会导致业务规则与技术实现耦合,破坏领域层独立性,违背DDD初衷。
- 你看到的“实体分布在两层”的情况,大概率是混淆了领域实体与持久化对象。比如双数据库场景下,针对PostgreSQL、MongoDB分别定义的JPA实体、MongoDB文档对象,属于基础设施层的适配对象,是领域实体到数据库存储的转换层,而非领域实体本身。
- 正确做法:领域层定义纯业务导向的领域实体,基础设施层根据不同数据库要求定义对应持久化模型,在仓库实现中完成领域实体与持久化模型的双向转换。
双数据库场景补充建议
针对你使用PostgreSQL+MongoDB的场景,补充实践要点:
- 先按业务边界划分聚合,确定哪些聚合适配关系型数据库(需强事务、复杂关联的业务),哪些适配文档型数据库(数据结构灵活、无强关联需求的业务)。
- 每个聚合对应一个领域层的仓库接口,基础设施层为不同数据库的聚合实现对应仓库:比如关系型聚合用JPA实现仓库,文档型聚合用MongoDB客户端实现仓库。
- 仓库实现内部负责领域实体与持久化对象的转换,领域层完全无需感知数据库类型差异。
内容的提问来源于stack exchange,提问作者Disppp
相关产品推荐
相关产品推荐

