课程大纲
Day1 | |
一、软件复杂度 -软件行业的主要任务就是对应复杂度 1. 领域驱动设计概览 2. 战略与战术 3. 战略层面的三件事 与 战术层面的核心结构 4. 软件复杂度的三个成因 5. 分离关注点 – Unix设计哲学 6. 隔离业务复杂度与技术复杂度 7. 复杂度的横切与纵切 8. 领域驱动设计对软件复杂度的对应 | |
二、宏观设计流程 -- 分析业务领域 1. 什么是业务领域 / 子域 2. 为什么需要考虑领域/ 子域 3. 子域的类型:通用 /核心 /支撑 4. 子域的比较 5. 如何识别子域的边界 6. 业务领域分析案例 | |
三、宏观设计流程 -- 限界上下文 1. 领域专家心智模型上的分歧 2. 通用语言所遇到的问题 3. 建模的本质 与 限界上下文 4. 限界上下文的目的:消除歧义 5. 限界上下文与通用语言 6. 案例:支付宝关联银行账户的建模分析 7. 不要将有二义性的领域概念放在同一限界上下文中 8. 理解限界上下文 9. 案例:限界上下文案例分析 – 信用卡申请 | |
四、架构 – 总有一款适合你 1. 认识分层架构 2. 分层架构的演化 3. DIP依赖倒置原则 4. 领域驱动架构的演进 5. 界限上下文与架构 6. 六边形架构 7. 端口与适配器 8. 整洁架构 9. CQRS架构 10. 在CQRS中处理具有最终一致性的查询模型 | |
五、业务逻辑实现模式 1. 事务脚本模式 2. 事务脚本实现的误区 3. 事务脚本的幂等实现 4. 活动记录模式 | |
六、微观设计–系统的对象化:SOLID建模原则 1. 单一职责原则 SRP 2. 案例:不符合 SRP的设计 / 符合 SRP的设计 3. 演习:在银行业务中,一个不符合SRP的账户管理系统的重构 4. 缺陷并提出重构方案。 5. 开放封闭原则 OCP 6. 案例:如何应对促销需求的变化 7. 里氏替换原则 LSP 8. 演习:银行账户管理系统,储蓄账户 (SavingsAccount) 和支票账户 (CheckingAccount) 的一种不符合 LSP的设计与重构 9. 案例:新产品的实现需求 -- 是继承还是组合 10. 接口隔离原则 ISP 11. 案例:如何做到两全其美 12. 演习:一个通用的BankAccount 接口的设计重构 | |
七、模块化实战案例: 实战:遗留代码重构 -银行贷款计算模块
| |
Day2 | |
一、模块化微观设计-- 值对象 1. 什么是值对象 2. 值对象的特征 3. 为什么值对象这么容易被忽略 4. 案例:Money对象建模与值对象 5. 案例:实现值对象层超类型 | |
二、模块化微观设计-- 实体 1. 贫血模型 2. 如何避免贫血,实体与领域服务之间的分寸 3. 唯一标识 4. 委派标识 5. 案例:实现实体层超类型(Layer Supertype) 6. 实战 –订单系统建模 实体行为归属甄别 | |
三、模块化微观设计– 比类更高一层的封装 1. 聚合设计原则 2. 聚合设计的过程 3. 聚合的一致性边界 4. 一个事务中只处理一个聚合 5. UML 中的聚合 与 DDD 中的聚合 6. 聚合内实现事务一致性 7. 聚合外实现最终一致性 8. 案例:银行账户与交易之间的建模关系 9. 聚合设计的注意点 | |
四、模块化微观设计- 应用服务 1. 用例 (Use Case) 与应用服务 2. 微服务的网关 与 应用服务 之间的关系 3. 应用服务中的 编排,转换,验证,转发 4. 工作单元 (Unit of Work) 5. 数据传输对象 (Data Transfer Object) 6. 事务脚本 (Transaction Script) 与领域模型 7. 依赖注入在应用服务中的使用 8. 案例:实现应用服务 9. 应用服务的关注点 | |
五、模块化微观设计- 领域服务 1. 领域服务的幂等性 2. 案例:实现领域服务 | |
六、领域事件 – 保持最终一致性的信使 1. 领域事件是领域建模中极其重要的部分 2. 事务一致性,高并发下的窘境 3. 最终一致性,妥协带来高扩展性 4. 原则:一个事务中只对一个聚合进行修改 5. 案例:实现抽象事件源,发布事件源 6. 案例:实现抽象事件处理 7. 案例:实现领域事件的发布与订阅 8. 实战 -任务分配执行系统 任务分配领域逻辑 | |
七、资源库 – 聚合的起点与终点 1. 集合特性 2. 资源库与数据访问层的区别 3. 资源库的误解 4. 资源库的实现要点 5. 案例:资源库的实现 6. 领域模型 VS数据模型 7. 案例:泛型资源库 | |
八、微服务中基于事件的系统架构 1. 微服务之间如何稳健的发布与消费事件 2. 如何保证发布事件的原子性 3. 使用事件表发布事件 4. 案例:如何实现事件感知聚合根 5. 案例:如何实现事件感知资源库 6. 如何通过 AOP 进行通用的事件处理 | |
九、微服务形式下的CQRS 1. DDD中的典型写操作 2. 基于数据模型的读操作 3. 基于领域模型的读操作 4. 读写分离模型 5. 案例:电商系统中的读写分离场景 6. 单进程单实体 + 共享存储/共享模型:Inventory详情查询 7. 单进程单实体 + 共享存储/分离模型:Product摘要查询 8. 单进程跨实体 + 分离存储/分离模型:Product详情查询(包含Category信息) 9. 跨进程跨实体 + 分离存储/分离模型:Order详情查询(包含Product信息) |