DDD四层架构和MVC三层架构的个人理解和学习条记

打印 上一主题 下一主题

主题 2298|帖子 2298|积分 6894

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
DDD的全称为Domain-driven Design,即领域驱动设计,从名字上就可以看出这里的核心就是Domain即领域。
与MVC的区别

DDD四成架构中的要素与传统三层架构还是挺相似的:


  • 用户界面层UI(User Interface Layer)
  • 业务逻辑层BLL(Business Logic Layer)
  • 数据访问层DAL(Data Access Layer)
一个重要的变革是将业务逻辑层的服务拆分成了应用层和领域层,MVC是在三层架构的底子上设计的一种框架型架构,三层架构是一种宏观的概念,适用于任何语言,而MVC只是一种比较详细的三层架构的框架实现。
MVC三层模型是面向数据库开辟,接到一个需求时先设计数据库,从数据库开始倒着往controller设计实现代码逻辑,如果一开始数据库设计不合理,后期想要改动就会很困难了。
DDD四层模型是以业务领域来划分实现详细的逻辑,就像我们的衣柜,在MVC里就是一个整体的衣柜,如果家里职员越来越多,爷爷、奶奶、大宝、二宝、三宝,那么衣柜将会越来越乱。而DDD里就会分为爸爸的衣服、妈妈的衣服、女儿的衣服,乃至每一个下面还可以再细分为女儿的T恤、女儿的裤子、女儿的配饰…DDD领域驱动设计和我们常说的面向对象编程、微服务实在很相似。
软件设计关注的应该是业务,而不是数据库!以数据库来设计软件有点本末倒置,关注数据长期化只不外是受限于物理条件限制不得已而为之,就像阿里盒马领域驱动设计实践博客中作者所说的:
   假设你的机器内存无穷大,永远不宕机,在这个前提下,我们是不必要长期化数据的,也就是我们可以不必要数据库,那么你将会怎么设计你的软件?
  代码实现

DDD架构的四层:


  • Interface层吸取请求
  • Application层编排请求必要的各个Domain服务(这一层尽量薄,尽量只做编排不放业务逻辑)
  • Domain层根据领域来实现详细的业务逻辑操纵
  • Infrastructure层实现数据库操纵和调用外部服务
请求过程

DDD联合ProtoBuf开辟接口的实现流程

  • Interface层将ProtoBuf协议转换成Application层的DTO
  • Application层将DTO转换成Domain层的entity
  • Domain层调用Infrastructure层时根据entity来构造Infrastructure层的DTO
  • Infrastructure层实现数据库操纵将DTO转成DO对象,调用外部服务时则将DTO转成ProtoBuf协议
响应过程


  • Infrastructure层实现数据库操纵将DO转成DTO对象返回,调用外部服务时则将ProtoBuf协议转成DTO返回
  • Domain层将Infrastructure层的DTO构造成entity返回
  • Application层将Domain层的entity构造成DTO返回
  • Interface层再将Application层的DTO转换成ProtoBuf协议返回给调用方
实体转换



  • Assembler:属于应用层,重要作用是将一个领域对象或一组领域对象转换成一个DTO数据传输对象,或将DTO转换回领域对象
  • Converter:属于底子层,其重要作用是将领域对象转换成DO数据库对象,或将DO对象转换会领域对象
代码实现

为了方便各层公共部门复用,实际项目中发起多分出一层common层,用来存放整个项目中各层公共依靠的部份,比如公共的enums罗列定义、contants常量定义、utils工具类这些:
  1. ├─interface --接口层
  2. │  ├─XxApiImpl.java
  3. │  └─OoApiImpl.java
  4. ├─application --应用层
  5. │  ├─service
  6. │  │  ├─XxApplicationService.java
  7. │  │  ├─OoApplicationService.java
  8. │  │  └─impl
  9. │  │    ├─XxApplicationServiceImpl.java
  10. │  │    └─OoApplicationServiceImpl.java
  11. │  └─dto
  12. │     ├─XxDTO.java
  13. │     └─OoDTO.java
  14. │  
  15. ├─domain --领域层
  16. │  ├─service
  17. │  │  ├─repository --仓储层接口
  18. │  │  │  ├─XxRepository.java
  19. │  │  │  └─OoRepository.java
  20. │  │  ├─XxDomainService.java
  21. │  │  ├─OoDomainService.java
  22. │  │  └─impl
  23. │  │     ├─XxDomainServiceImpl.java
  24. │  │     └─OoDomainServiceImpl.java
  25. │  └─entity
  26. │     ├─XxEntity.java
  27. │     └─OoEntity.java
  28. │  
  29. ├─infrastructure --基础层
  30. │  ├─repository --仓储层
  31. │  │  ├─model --数据库DO对象
  32. │  │  │  ├─XxDO.java
  33. │  │  │  └─OoDO.java
  34. │  │  ├─mapper --持久层
  35. │  │  │  ├─XxMapper.java
  36. │  │  │  └─OoMapper.java
  37. │  │  └─impl
  38. │  │    ├─XxRepositoryImpl.java
  39. │  │    └─OoRepositoryImpl.java
  40. │  └─dto
  41. │     ├─XxDTO.java
  42. │     └─OoDTO.java
  43. │  
  44. ├─common --公共层
  45. │  ├─enums --公共枚举
  46. │  ├─constants --公共常量
  47. │  └─utils --公共工具类
  48. │  
复制代码
不答应跨层调用,interface层只能调application层,application层只能调domain层,domain层只能调infrastructure层,公共层common则各层都可以调用。

大家都是码农:AI时代,零底子也能学会编程!
   关于作者:从美工、前端开辟一路乐成转型Java后端的野生码农
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表