架构学习-DDD领域驱动设计(八)

549 阅读3分钟

DDD的全称为Domain-driven Design,即领域驱动设计.

image.png

领域:二手商品(二手车)交易平台,宠物托管平台

子域:支付子域,产品子域,用户认证子域

界限上下文:支付上下文,认证上下文

子域提供问题空间,界限上下文提供解决空间

image.png

领域驱动主模块划分:界限上下文

image.png

image.png

实体Entity(可以理解成为学校的学生)

  • 唯一标识(用户提供,应用生成UUID/GUID,持久化生成)
  • 数据可变
  • 生命周期管理(订单状态管理)
  • 唯一标识是实体与实体,聚合与聚合之间的纽带

值对象Value Object(可以理解为一本书)

  • 无标识
  • 数据不可变,可复制,可替代
  • 整体性(比如:¥100,只有将人民币单位跟100结合在一起才能表示这是100元钱)
  • 度量和描述

聚合Aggregate(可以理解为学校里面的班级)

  • 事务一致性边界.(一起上课,一起打比赛,一起联谊,一起打架)
  • 聚合之间通过聚合根(通常为聚合同名实体)进行沟通.(聚合根可以理解为一个班的班长,班长可以代表这个班进行联谊,打比赛,这个班级也可以指代班级,比如张三的班级xxxx)
  • 尽量缩小聚合(最终一致性和领域消息).(小聚合易于扩展)
  • 聚合是创建,发布领域事件和操作资源库的操作主体.(一切荣誉归班级,黑锅一起背)

工厂Factory

  • 创建聚合实体
  • 工厂类,工厂方法,创建者模式
  • 对象解耦
  • 封装复杂操作过程

资源库Repository

  • 聚合的增删改查
  • 对接持久化机制(如:mybatis)
  • 和DAO,Mapper类似,但更侧重集合的处理
  • 封装复杂操作过程

领域服务Domain Service

  • 无状态
  • 无法归为实体和值对象
  • 业务操作过程,对领域对象进行转换
  • 如:密码加密服务,文字转换服务,应收账款和应付账款对账

image.png

属性和约束:值对象化

比如:

  • 100块钱打车能开30公里,这就是属性
  • 我这次出差打车费不能超过100块,这就是约束
  • 把这些相关内容,相关逻辑封装在一个值对象里面,限制实体描述实体这就是属性和约束

贫血充血模型

  • 血:业务逻辑
  • 贫血:getter setter方法,CRUD工程师
  • 充血:说人话,应用逻辑为主,数据管理为辅
  • 贫血:上手快,发展受限,适合应用逻辑简单,信息记录类型的业务
  • 充血:上限高,容易三高,适合逻辑复杂,信息处理类型的业务

CQRS(Command Query Responsibility Separation):写和读的责任分离

  • Command:执行动作,返回void
  • Query:只查询不修改对象状态
  • 风格:事件驱动系统风格,管道过滤器风格

事件风暴核心思想

  • 由下而上,更快
  • 事件驱动,更新
  • 团队破冰,更嗨