Command | Query | Event | |
---|---|---|---|
语意 | 希望触发的操作 | 条件查询 | 已经发生的事件通知 |
读/写 | 写 | 只读 | 取决于下游,通常写 |
返回值 | DTO/Boolean | DTO/Collection | Void |
CQE 规范
- 创建:当只有单个ID查询时可省略CQE,否则应该创建对应CQE对象
- 校验:校验应该前置,字段上可定义注解,并在Controller/Facade 层校验
- 避免复用:CQE有自己的语义,可以基于基类产生它们,但应该避免复用
- 模型转化:以下类型推荐转为DP— Domain Primitive, 也是
Value Object
,不可变对象后再使用,如果有需要在DP中进一步校验- 有限制的String、Integer
- 复杂的数据结构,比如
Map<String,Object>
Data Transfer Object | Domain Primitive | Entity | |
---|---|---|---|
组成 | 基础字段 | Type(独一的数据类型)与Class(逻辑聚合到类中) | DP |
功能 | 数据传输,属于技术细节 | 业务域中的概念 | 业务概念 |
数据的关联 | 只是一堆字段在一起,弱关联 | 字段高度相关 | DP的组合 |
行为 | 无行为 | 有行为和业务逻辑 | 有行为和业务逻辑 |
DDD不是什么特殊的架构,而是任何传统项目经过反复合理重构后会抵达的终点。
没有抵达之前糅合了MVC的代码架构可能是这样的: