DDD(Domain-Driven Design)领域驱动设计
出现背景
三层应用架构:数据 - 应用 (业务逻辑层)- 展现,通常是以数据位为起点进行数据库分析设计,服务层过重,数据模型失血,没东西.
面条式编程或者面向数据库编程,服务层围绕数据库作业完成业务逻辑,经常一条线撸到底;
代码一整块一整块的过重,很难扩展复用;
数据库模型只是数据库映射,没有相关的行为支撑,行为都被上一层 Service 给完成等了,因此是失血的领域模型;
领域模型是对业务模型的抽象,DDD革命性在于:
领域模型准确反映了业务语言,传统数据对象除了简单setter/getter方法外,没有任何业务方法,即失血模型
而DDD领域采用充血模型(业务方法定义在实体对象中,例如:生成订单时,判断商品不能为空)
分层
- 接口层
- 对外提供能力/接口,HTTP接口,RPC接口等
- 应用层
- 接口与核心之间的层次,主要是将核心对象封装、组合成完整的业务流程,为接口提供服务
- 领域层/核心层
- 将核心业务逻辑拆分为功能相对独立的各个子模块。 子模块和具体业务流程无关或关联性不大,封装了核心的知识,并对外提供抽象接口。
- 基础设施层/防腐层/ACL
- 服务对外依赖,包括数据库、消息队列等
三层架构到四层架构之间的演进
-
三层架构向DDD分层架构演进,主要发生在业务逻辑层和数据访问层。
-
DDD分层架构在用户接口层引入了DTO,给前端提供了更多的可使用数据和更高的展示灵活性。
-
DDD分层架构对三层架构的业务逻辑层进行了更清晰的划分,改善了三层架构核心业务逻辑混乱,代码改动相互影响大的情况。
-
DDD分层架构将业务逻辑层的服务拆分到了应用层和领域层。应用层快速响应前端的变化,领域层实现领域模型的能力。
-
-
另一个重要的变化发生在数据访问层和基础层之间。
三层架构数据访问采用DAO方式;
DDD分层架构的数据库等基础资源访问,采用了仓储(Repository)设计模式,通过依赖倒置实现各层对基础资源的解耦。
仓储又分为两部分:仓储接口和仓储实现。
仓储接口放在领域层中,仓储实现放在基础层。原来三层架构通用的第三方工具包、驱动、Common、Utility、Config等通用的公共的资源类统一放到了基础层。
传统三层架构向DDD分层架构的演进,体现的正是领域驱动设计思想的演进。
The whole significance of life lies in the unremitting efforts to explore the unknown and increase knowledge.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了