一.代码示例
mvc和ddd
1.定价
2.转账
3.用户注册
4.权益推荐
基于流程图的事件,命令分析
二.背景
时间 | 人员 | 经典书籍 |
1994 | GoF | design patterns |
1999 | maintin flowler | refactoring |
2002 | maintin flowler | Patterns of Enterprise Application Architecture |
2003 | Gregor Hohpe / Bobby Woolf | Enterprise Integration Patterns |
2003 | Eric Evans | Domain Driven Design |
2008 | Uncle Bob | Clean Code |
2014 | Vaughn Vernon | Implementing DDD |
2018 | Uncle Bob | Clean Architecture |
三.DDD介绍
1.DDD是什么
以数据和表为中心改为以业务和领域模型为中心.确保业务模型和代码模型的一致性.
ddd:自上而下的过程拆解,自下而上的对象的抽象。
2.战略设计
分治的思路,领域,子域,核心域,通用域(权限、登录),支撑域,限界上下文,CQRS,通用语言,四色建模.
3.战术设计
实体(贫血+实体服务),领域服务,聚合,聚合根,Domain Primitive,值对象,领域事件,资源库,事件风暴,
4.分层
controller层,appliction层,domain领域服务层,infrastructure基础设施层,repository仓库层,acl防腐层
5.app层设计
6.领域层设计
(1).实体
- 一个Entity内不应该直接注入另一个Entity或服务.可以作为方法入参传入回调
- 涉及多个Entity变更或查询用领域服务实现
- 只通过业务方法修改业务状态,避免set方法造成内部状态不一致.
- 可以通过构造方法,默认参数,工厂模式创建对象.
- 只保存外部实体的id
- 行为方法只影响本实体或者子实体状态.
- 实体与值对象,比如用户和住址,用户表里面有省市区的列。对应实体User和值对象Address.
(2).领域服务
- 只影响单个实体,涉及查询多个实体,通过方法注入.
- 影响多个实体状态的操作,跨实体事务
(3).聚合
聚合内的对象生命周期一致,问题域一致,使用场景频率一致,聚合内元素尽可能少.对外只暴露聚合根.
四.目前发展
cola
五.xxx系统
1.服务
核心域,支撑域,通用域
2.包结构
老service不增加.
层级 | 包 | 内容 | 出参 | 入参 |
controller层 | controller,kafkaconsumer,xxxListener,xxxJob | 网络协议的转化、权限管理,捕获异常,aop等. | CommonRspVo | xxxVo |
application层 | xxxManager,xxxHandler,xxxConvertor,xxxAssembler | 业务流程的编排,调度,事务 没有具体业务逻辑.(无if分支,无计算逻辑). 参数校验. | xxxDTO | xxxVo或xxxReq,xxxCmd |
domain层 | xxxService | 业务的原子能力 | xxxEntity | xxxReq或者业务入参 |
infrastructure层 | common,enum,constant,dao,config | 枚举,公共包,常量,数据访问 |
六.参考书
<领域驱动设计:软件核心复杂性应对之道>
<实现领域驱动设计>
<领域驱动设计精粹>
<微服务架构设计模式>