二领域驱动设计~战术篇
Posted 戴泽supp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二领域驱动设计~战术篇相关的知识,希望对你有一定的参考价值。
二、领域驱动设计~战术篇
1、前言
这篇文章主要关注的是领域驱动设计(DDD)代码设计实施上的一些设计概念和原则。
是从技术视角出发,侧重于领域模型的技术实现,完成软件开发和落地,包括:聚合根、实体、值对象、领域服务、应用服务和资源库等概念解释和代码逻辑的设计和实现。
战略篇请参考:一、领域驱动设计-战略篇
2、战术设计阶段:DDD 中的重要的一些概念
1)、实体
- 有唯一标识符,就算其他所有属性完全相同,只要标识符不一致就是不同的实体,标识符一致就是同一个实体,我们把这样的对象称为实体。
2)、值对象
- 没有唯一标识符,只要属性一致,就是同一个值对象
- 值对象与实体区别如下图
3)、应用服务
- 服务协调多个领域服务和聚合及对其他微服务调用
4)、领域服务
- 无法划分到实体和应用服务的行为方法,比如跨多个实体的业务逻辑(类似于Service层的类)
- 领域服务和上文中提到的应用服务是不同的,领域服务是领域模型的一部分,而应用服务不是。应用服务是领域服务的客户端,它将领域模型变成对外界可用的软件系统。
5)、领域事件
- 用最终一致性取代了事务一致性,通过领域事件的方式达到各个组件之间的数据一致性
- 领域事件的命名遵循英语中的“名词+动词过去分词”格式,即表示的是先前发生过的一件事情。比如,购买者提交商品订单之后发布
OrderCreated
事件,用户支付TradePaid
事件
6)、聚合 & 聚合根
聚合
- 聚合是业务和逻辑紧密关联的实体和值对象的组合
- 跨多个实体的业务逻辑通过领域服务来实现,跨多个聚合的业务逻辑通过应用服务来实现
- 聚合的特点:高内聚、低耦合,它是领域模型中最底层的边界,可以作为拆分微服务的最小单位
聚合根
- 聚合根的特点:聚合根是实体,有实体的特点,具有全局唯一标识,有独立的生命周期
- 一个聚合只有一个聚合根,所有外部对聚合的访问都要通过聚合根
7)、工厂
- 工厂封装复杂实体的创建逻辑,都是对领域对象的生命周期进行管理.
8)、资源库
- 资源库包括但不限于传统的 dao 接口(数据库/内存/redis缓存/其他资源)
9)、防腐层
- 当你的领域和其他领域存在数据交互时,你需要一个防腐层作为两个领域之间的纽带。这会给你带来很多“数据转换”的代码,但是对于业务多变的系统来讲,它能保护你的领域,这是值得的。
- 防腐层主要起到隔离的作用
10)、模块
- 就是项目中的 package
- 一个模块用于存放领域中内聚在一起的类,模块之间松耦合
- 模块应该根据通用语言来命名,且应与领域概念保持协调一致
- 同层模块之间,尽量杜绝循环依赖
以上是关于二领域驱动设计~战术篇的主要内容,如果未能解决你的问题,请参考以下文章