一、DDD概述
DDD,即领域驱动设计,核心是不断提炼通用语言并用于与领域专家等团队所有成员交流,并用代码来表达出一个与通用语言一致的领域模型。
通用语言:通过团队交流达成共识的能够简单清晰准确传递业务规则的语言(可以是文字、图片等)
领域:软件系统要解决的问题域,是有边界的。领域一般包含多个子域,子域根据其功能划分为核心域、通用域、支撑域。
限界上下文:描述领域边界,一个限界上下文可能包含多个子域,但一般实践上都以一对一为好。应用单元和部署单元一般也与限界上下文一致。
领域与限界上下文.png
限界上下文映射:多个上下文之间如何进展系统交互集成。
上下文映射.png
领域模型:对我们软件系统中要解决问题的抽象表达(解决方案)。模型一般在一个限界上下文中有效。
模块
聚合根
实体
值对象
领域事件
仓储定义
领域服务
工厂
限界上下文映射的反腐层定义
限界上下文中的领域模型.png
领域实现:
领域模型
应用服务
基础设施
服务暴露
仓储实现
反腐层实现
实践步骤为:
找到子域
识别核心域、通用域、支撑域
确定限界上下文映射
在每个子域内设计领域模型
实现领域模型和应用
二、示例需求分析
要实现多规格商品的创建和查询。
spu domain
Spu相关操作如下:
@RestController
@RequestMapping("/v1/spu")
public class SpuRestApi {
//spu创建
@PostMapping("/create")
public Result create(@RequestBody SpuCreateParam param){
}
//spu详情
@GetMapping("/detail")
public Result findSpuById(Long shopId, Long spuId){
}
}
SpuCreateParam的定义如下:
其中spuNo,skuNo,barCodes等要求唯一
{
"shopId": 0, //店铺ID
"categoryId": 0,//分类ID
"unitId": 0,//单位ID
"name": "string",//SPU名称,长度20,不能为空
"spuNo": "string",//SPU编码,不可变更,用于各系统间传递
"barCodes": [//SPU条码列表,最多10个,用于搜索
"string"
],
"photoTuple": {//图片列表,最多10张
"photos": [
{
"url": "string" //必须为合法url,每个url长度最大为120
}
]
},
"specDefineTuple": {//规格定义,项与值都不能重复,相对顺序用于sku列表的排序
"defines": [//规格项列表,如【颜色+尺寸】