DDD领域驱动模型
2023-12-26 09:24:48 49 举报
AI智能生成
DDD领域驱动模型
作者其他创作
大纲/内容
应用服务&领域服务
应用服务
表述应用行为
eg.购物车结算=>应用行为
隐藏领域层的复杂性及其内部实现
领域服务
表述领域行为
eg.金额计算、支付、生成订单=>领域行为
领域事件
基本概念
捕获领域中发生的具有业务价值的一些事情
eg."订单支付成功"=>一个领域事件
建模领域事件
核心
封装不变,应对万变
要点
事件源
事件处理
实现
发布-订阅模式
事件总线 (EventBus)
最终一致性
案例
订单系统发布"订单成功支付"事件
库存系统订阅并处理库存扣减逻辑
通知系统订阅并处理拣货通知
实现
事件存储
事件发布可用于重新发布
通过消息中间件去分发事件
事件溯源
事件源
用于恢复到某个状态
聚合
来源
UML类图概念,整体与部分的关系
eg.车和轮胎=>可以独立存在
DDD中的概念
领域对象的显示分组
封装业务
保证聚合内领域对象的数据一致性
关键
领域对象间的关联关系
基于业务用例而非现实生活建立必要关联
减少不必要的关联
将双向关联转换为单项关联
领域不变性
领域内需要关注的业务规则
难点
一致性的维护
聚合内实现事务一致性
聚合外实现最终一致性
设计
一个持续性的活动
无法一口吃个胖子
持续改进聚合的设计
仓储
特性
一个聚合的集合
存储集合
删除集合
要点
通过聚合根来持久化和检索领域对象
隐藏聚合持久化和检索的底层技术实现
定义数据模型与领域模型的边界
映射
ORM
仓储使用ORM持久化领域对象的状态
定义
领域模型与持久化存储之间的明确契约
实现
泛型仓储
简化代码
明确意图
事务管理
UnitOfWork (UOW)
工厂
目标
隐藏对象的复杂创建逻辑
表达对象实例化的意图
实现
简单工厂
工厂方法
抽象工厂
反射工厂
好处
将领域对象的使用和创建分离
隐藏创建复杂领域对象的业务逻辑
根据调用者的需要创建相应的领域对象
封装聚合的内部状态
模块
抽象
对领域模型进行分解的产物,相对独立的功能单元
由一系列高内聚的领域对象组成
设计
根据领域来组织模块
基于通用语言
模块命名规范
高内聚低耦合
模块内高内聚
模块间低耦合
实现
通过命名空间进行分离
使用单独项目进行分离
通用语言
三个特点
简单易学
使用率高
国际通用
概念
通过团队交流达成共识的能够准确传递业务规则的简单语言
价值
解决了交流障碍问题,使领域专家和开发人员协同合作
领域
本质
问题域
被界限在指定的也无需求之中
有清楚的范围边界
区别
与传统开发过程的区别在于DDD注重领域建模
例子
电商网站
拆分子域:商品子域、用户子域、销售子域、订单子域...
核心域:销售子域
业务系统核心价值所在
通用子域:日志子域
支撑子域:除了销售子域之外的子域,如物流子域
限界上下文
概念
限界
一个界限,某个具体的范围
上下文
语境
例子
商品
在销售子域和商品子域中就是商品
在物流子域中特指货物,只关注部分属性
命名
领域名+上下文
eg.销售上下文, 物流上下文...
领域模型
概念
描述正在解决的问题及提出的解决方案
特征
综合了系统分析和设计
语言、模型、代码三者紧密绑定
可以通过UML类图来展示
实体
概念
实体=唯一身份标识 + 可变性【状态(属性) + 行为(方法或领域事件或领域服务)】
特征
唯一标识
委派标识
为了迎合ORM而创建,和领域实体标识无关系
领域标识
基于领域实体概念分析确定的唯一身份标识
eg.支付宝交易流水号
生成时机
即时生成
延迟生成
可变性
实体的状态
eg.订单状态:未支付、正常、已发货、关闭
实体的行为
eg.订单行为:支付、发货、关闭
值对象
概念
值对象=值+对象 => 将一个值用对象的方式进行表述,表达一个具体的固定不变的概念
值的特征
表示一个具体的概念
通过值的属性对其识别
属性判等
固定不变
案例
购物网站的客户收货地址信息
作用
符合通用语言,更简单明了的表达简单业务概念
简化设计,减少不必要的数据库表设计
值对象不会孤立存在,可作为所属实体的数据列
多个值对象序可以列化到单个列
建模
结合通用语言的表述检查其是否具有值得的含义和特征
0 条评论
下一页