在DDD代码实践过程出现一些看起来很别扭的实现html
为了查询,领域聚合根无限扩大web
如商品详情页聚合根数据库
public class BrandAggr { /** * 惟一标识 */ private Long id; /** * 商品简介 */ private ItemInfoVal brandInfoVal; /** * 商品的渠道列表 */ private List<ItemChannelVal> channels; /** * 商品的价格区间列表 */ private List<ItemPricingVal> pricings; /** * 商品风格列表 */ private List<ItemStyleVal> styles; /** * 商品促销列表 */ private List<ItemPromotionVal> promotion; /** * 推荐列表 */ private List<ItemRecommendVal> promotion;
CQRS(Command and Query Responsibility Segregation)是一种与传统的DDD实现不一样的模式,将写与读区分开。CQRS适用于DDD的缘由在于查询自己不该当影响领域建模编程
CQRS 主要包含两大概念,一个是读写分离,一个是事件源。事件源不是必须项,缓存
读写分离架构
若是一个方法修改了对象的状态,就是一个命令,不该该返回数据svg
阻抗:建立资源的时候,不是要返回资源id吗(这个不是重点能够忽略)
若是一个方法返回了数据,该方法就是一个查询,不该该直接或间接的修改对象的状态wordpress
阻抗:如今有些方法中在查询的时候进行了懒删除性能
CQRS指望解决的问题设计
command bus:接受写请求,分发给commandhandle
commandhandle:将领域事件保存到event store,同时publish消息到event bus
event bus: 分发给不一样event handle
event handle: 将对象的变动更新到query数据库
领域对象
咱们再也不是使用一套领域对象了,领域对象主要针对的是写。读直接是DTO
好比上面提到的brand聚合就不会无限扩大了。
面向事件编程
- 对象的全部变动经过事件来记录, - 对象的历史状况,还原都是经过事件db来处理 - 系统间的交互经过事件来实现
事件溯源目前比较难落地,读写分离能够尝试。
遵循聚合根的定义,必须与对象的组合区分开,对象组合考虑用DTO或者其余
咱们再来回顾下聚合根。解决开头两个问题
Aggregate(聚合)是一组相关对象的集合,做为一个总体被外界访问,聚合根(Aggregate Root)是这个聚合的根节点。
聚合是一个很是重要的概念,核心领域每每都须要用聚合来表达。其次,聚合在技术上有很是高的价值,能够指导详细设计。
聚合由根实体,值对象和实体组成。
如何建立好的聚合?
- 为了查询,领域聚合根无限扩大
- 组合领域对象是领域吗?如商品详情页,包含商品,促销,推荐,这这种场景下如何使用聚合根
组合领域对象是领域,衍生出一些业务逻辑,可是不该该定义为聚合根,聚合根应该是小的,事务一致性的,面向领域自己的。
像商品详情页这种应该使用DTO来组合。
https://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf
https://www.cnblogs.com/zhili/p/CQRSDemo.html
http://www.cnblogs.com/daxnet/archive/2011/01/06/1929099.html
实现领域驱动设计第十章聚合