如何让DDD落地

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. DDD 和坚
2. AGENDA 01 为什什么DDD落地难 02 从需求到代码 03 当需求发⽣生变化时 04 把⼤大象塞进冰箱
3. 01 为什什么DDD难落地 从2003年年由Eric Evans提出DDD以后,在软件开发领域⼀一直 都是雷雷声⼤大,⾬雨点⼩小。这⼏几年年之所以开始⽕火起来,主要的功 劳也要给队友“微服务”,那么这是为什什么呢?
4. DDD的⽬目标是什什么
5. 软件设计的⻔门槛是什什么
6. DDD⾥里里难懂的概念
7. 谁来做领域专家? 产品经理 系统分析师 技术组长 架构师
8. 如何从需求到DDD? 我想要⼀一个电商 平台,我可以在 上⾯面卖东⻄西 ?
9. Event Storming⾥里里缺少了了什什么信息 如何添加商品? 提交订单的时候 要做什什么检查? ⽀支付订单的时候和 ⽀支付宝对接的逻辑 是什什么样的? 魔⻤鬼隐藏在 细节 之中
10. 02 从需求到代码 今天既然是讲落地,那么就从⼀一个实际需求出发,我们看看 如何把需求拆解成⽤用户故事,然后如何把⽤用户故事转变成领 域故事,最后领域故事⼜又如何变成为代码。
11. 京⻄西商城的需求 ‣ 产品运营⼈人员可以添加新的商品,编辑产品库存,并发布到京⻄西商城,⽤用户 可以进⾏行行购买; ‣ 京⻄西商城的买家可以查看产品可购买的库存数量量,并⽣生成购买订单,买家可 以撤单,查看订单的状态,对订单进⾏行行⽀支付(⽀支付宝)。⽀支付成功后,仓储 管理理员会收到出库请求,进⾏行行配货并发货。同时,买家可以查看物流状态以 及确认收货。
12. 事件⻛风暴暴的结果
13. 事件⻛风暴暴得到的命令和事件就没⽤用了了吗? SubmitOrderCommand 接收 订单 已创建 提交 订单 ⽤用户 库存 已锁定 订单聚合创建订单服务 ⽣生成 OrderCreated 发送 仓库聚合的事件订阅者 ⽣生成 LockStockCommand 接收 仓库聚合锁定库存服务 ⽣生成 StockLocked QueryOrderCommand 接收 订单域查询服务 ⽣生成 OrderList
14. 需求分析到⽤用户故事 Story6 创建订单 作为⼀一个商城顾客 我可以确定购物⻋车中的商品和数量量,然后提交商品订单 为了了在商城上购买商品 Acceptance Criteria 1 - Given:导航【购物⻋车】 - When:确定购物⻋车中要提交的商品和数量量,然后点击提交; - Then:订单成功提交,从商品库存中锁定订单的数量量,提示⽓气泡“商品已保存成功” - And when:如果订单的数量量超过商品库存中可以锁定的数量量 - Then:订单⽆无法成功提交,提示⽓气泡“库存数量量不不够,仅剩X件”
15. ⽤用户故事到领域故事 点击提交按钮后 1.订单API控制器器会收到创建订单请求,然后根据请求⽣生成创建订单命令,然后让创建 订单应⽤用根据创建订单命令创建商品 2.创建订单应⽤用收到命令后,先调⽤用查询商品库存服务查找商品库存, 如果商品库存可以⽀支持订单数量量,就让创建订单服务根据创建订单命令进⾏行行订单 创建,创建成功后返回成功结果给订单API控制器器 如果商品库存不不⽀支持订单数量量,返回出错结果和原因给订单API适配器器 3.创建订单服务收到命令后,会把创建订单命令转换成订单,然后调⽤用订单仓库进⾏行行 保存,保存成功后会让事件发布器器发布订单已创建事件 4.事件发布器器会根据事件类型把订单已创建事件转发给商品库存订阅者, 5.商品库存订阅者收到事件以后会根据事件中的商品ID和订单数量量创建锁定商品库存 命令,然后给锁定商品库存服务进⾏行行库存锁定 6.锁定商品库存服务收到命令后,会把根据命令中的商品ID从商品库存仓库中获取商 品库存,然后根据让商品库存锁定订单数量量,之后调⽤用商品库存仓库进⾏行行保存,最后 让事件发布器器发布商品库存已锁定事件 …….
16. 领域故事中的主要对象 领域对象 类型 命名 订单API控制器器 Adapter OrderController 创建订单命令 Command CreateOrderCommand 创建订单应⽤用 ApplicationService CreateOrderApplication 查询商品库存服务 DomainService QueryStockService 商品库存 Entity Stock 订单 Entity Order 订单仓库 Repository OrderRepository 订单已创建 Event OrderCreated 商品库存订阅者 Subscriber StockEventSubscriber 锁定商品库存命令 Command LockStockCommand 锁定商品库存服务 DomainService LockStockService 商品库存仓库 Repository StockRepository 商品库存已锁定事件 Event StockLocked
17. 领域模型
18. 如何区分实体和值对象 Ø Ø Ø Ø Ø Ø Id / Ø Ø VS Ø Ø Ø Order/Car Equals() / Ø (Immutable) Ø Address/Color
19. 如何区分应⽤用服务和领域服务 应⽤用服务(很薄,没有业务逻辑) 领域聚合A 领域聚合B 领域聚合C 领域服务 领域服务 领域服务 X 领域服务之间最好不不要相互直接调⽤用
20. 使⽤用什什么架构
21. 六边形架构为什什么是六条边
22. 领域故事中的对象怎么对应到架构上 命名 OrderController CreateOrderCommand CreateOrderApplication QueryStockService Stock Order OrderRepository OrderCreated StockEventSubscriber LockStockCommand LockStockService StockRepository StockLocked
23. 领域层不不应该有任何外部依赖细节 适配器器层 领域层 API CreateOrderApplication OrderController 领域层 OrderRepositoryJPA DB OrderRepositoryMybatis 订单聚合 仓库聚合
24. 领域故事如何变成代码 创建订单服务收到命令后,会把创建订单命令转换成订单,然后调⽤用订单仓库进⾏行行保 存,保存成功后会让事件发布器器发布订单已创建事件
25. 03 当需求发⽣生变化时 软件中最痛苦的就是需求经常发⽣生变化,这也是DDD想要解 决的问题之⼀一,
26. 为什什么需求会变化? 需求提出者不不⼀一定想好了了 需求提出者的问题变化了了 沟通过程信息丢失
27. 需要增加⼀一些业务逻辑时 Acceptance Criteria 1 - Given:导航【购物⻋车】 - When:确定购物⻋车中要提交的商品和数量量,然后点击提交; - Then:订单成功创建,从商品库存中锁定订单的数量量,订单⽇日志需要记录这笔订单 创建,最后提示⽓气泡“商品已保存成功” - And when:如果订单的数量量超过商品库存中可以锁定的数量量 - Then:订单⽆无法成功提交,提示⽓气泡“库存数量量不不够,仅剩X件” 3.创建订单服务收到命令后,会把创建订单命令转换成订单,然后调⽤用订单仓库进⾏行行 保存,保存成功后会让事件发布器器发布订单已创建事件 4.事件发布器器会根据事件类型把订单已创建事件转发给商品库存订阅者,订单⽇日志订 阅者 5…. 6…. 7.订单⽇日志订阅者收到订单已创建事件后,会根据事件创建添加订单⽇日志命令,然后 调⽤用添加订单⽇日志服务来进⾏行行添加 8.添加订单⽇日志服务收到命令后,会把添加订单⽇日志命令转换成订单⽇日志,然后调⽤用 订单⽇日志仓库保存订单⽇日志
28. 需要拆分时
29. 坚持使⽤用事件进⾏行行服务间交互 Mediator拓拓扑架构 Broker拓拓扑架构
30. 04 把⼤大象塞进冰箱分⼏几步 打开冰箱,塞进⼤大象,关上冰箱
31. 把需求落地需要⼏几步 划界 ⽤用事件⻛风暴暴划分业务边界 透视 ⽤用实现细节编写领域故事 转码 把领域故事转换成代码 创建订单服务收到命令后,会把创建订单命令 转换成订单,然后调⽤用订单仓库进⾏行行保存,保 存成功后会让事件发布器器发布订单已创建事件
32. THANK YOU

首页 - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.3. UTC+08:00, 2024-11-25 03:26
浙ICP备14020137号-1 $访客地图$