一. 聚合与聚合根的含义

1. 聚合

聚合往往是一些实体为了某项业务而聚类在一起形成的集合 ,举个例子,社会是由一个个的个体组成的,象征着我们每一个人。随着社会的发展,慢慢出现了社团、机构、部门等组织,我们开始从个人变成了组织的一员,大家可以协同一致的工作,朝着一个最大的目标前进,发挥出更大的力量。领域模型内的实体和值对象就好比个体,而能让实体和值对象协同工作的组织就是聚合,它用来确保这些领域对象在实现共同的业务逻辑时,能保证数据的一致性。可以这么理解,聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化。

2. 聚合根

聚合由一个聚合根和上下文边界,这个边界根据业务单一职责和高内聚原则,定义了聚合内部应该包含哪些实体和值对象,而聚合之间的边界是松耦合的。按照这种方式设计出来的微服务很自然就是“高内聚、低耦合”的。聚合根的主要目的是为了避免由于复杂数据模型缺少统一的业务规则控制,而导致聚合、实体之间数据不一致性的问题。传统数据模型中的每一个实体都是对等的,如果任由实体进行无控制地调用和数据修改,很可能会导致实体之间数据逻辑的不一致。而如果采用锁的方式则会增加软件的复杂度,也会降低系统的性能。
如果把聚合比作组织,那聚合根就是这个组织的负责人。聚合根也称为根实体,它不仅是实体,还是聚合的管理者。首先它作为实体本身,拥有实体的属性和业务行为,实现自身的业务逻辑。其次它作为聚合的管理者,在聚合内部负责协调实体和值对象按照固定的业务规则协同完成共同的业务逻辑。最后在聚合之间,它还是聚合对外的接口人,以聚合根 ID 关联的方式接受外部任务和请求,在上下文内实现聚合之间的业务协同。也就是说,聚合之间通过聚合根 ID 关联引用,如果需要访问其它聚合的实体,就要先访问聚合根,再导航到聚合内部实体,外部对象不能直接访问聚合内实体。

二、聚合的设计原则

原则 说明
聚合设计的尽量小 如果聚合设计的过大,内部还有大量的实体和值对象,管理会比较复杂,高频操作会有并发和数据库锁冲突的问题,导致系统可用性降低; 聚合设计的足够小,也就降低了复杂度,可复用性也更高,降低了后期重构复杂聚合的成本;
聚合应该高内聚 封装的是真正的不变的领域对象,内部的实体和值对象按照固定的规则运行,实现数据的一致性,边界外的任何东西都于该聚合无关,
通过唯一标识符引用其它聚合 聚合之间通过聚合根的唯一ID来关联,而不是直接对象引用的方式,外部的聚合对象如果在本聚合范围内管理,容易导致边界不清晰,增加聚合之间的耦合度;
边界之外使用最终一致性 聚合内部数据强一致性,聚合之间数据最终一致性,在一次事务中最多只修改一个聚合的数据状态,如果在一次事务中涉及修改多个聚合的状态,应该使用领域事件的方式来异步的实现最终一致性,实现聚合之间的解耦;
在应用层实现跨聚合的调用 实现微服务内部聚合之间的解耦,以为为未来以聚合为单位的拆分和组合,应该避免跨聚合的的领域服务调用和数据表关联;

DDD中聚合、聚合根的含义以及作用相关推荐

  1. 深入理解DDD中的聚合

    本文来说下领域驱动设计中的聚合 文章目录 概述 聚合解决的核心问题是什么 聚合划分的原则 生命周期一致性 问题域一致性 场景频率一致性 尽量小的聚合 实现方面的考虑 资源库.工厂面向聚合定义 代码结构 ...

  2. 在c语言中保留字是有专门含义和作用的,c语言中的关键字和保留字的区别?

    c语言中的关键字和保留字的区别?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中的关键字和保留字的区别? 在C语 ...

  3. Python中的 __name__属性的含义和作用

    Python中的模块(.py文件)在创建之初会自动加载一些内建变量,__name__就是其中之一.Python模块中通常会定义很多变量和函数,这些变量和函数相当于模块中的一个功能,模块被导入到别的文件 ...

  4. DDD中的聚合和UML中的聚合以及组合的关系

    UML: 聚合关系:成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在. 如汽车(Car)与引擎(Engine).轮胎(Wheel).车灯(Light)之间的关系为聚合关系,引擎.轮胎.车灯 ...

  5. 聊一聊DDD中聚合的概念

    DDD中的聚合模式是最难弄清楚的一种模式,在如何确定聚合边界这个问题上,更没有一个明确的指导原则,这导致DDD的落地比较难.不过,相信你读了这篇文章应该对聚合会有更深刻的理解. 本文分三部分来讲: 1 ...

  6. DDD中的建模方法有哪些

    一.背景 在之前的文章中已经介绍了DDD相关的概念模式,DDD相关的业务技术架构,但是我们还没有找到一个核心的抓手去实践DDD.DDD的一个核心本质就是对业务建模,或者领域建模.说的很简单,但是做好确 ...

  7. 1.DDD中的领域对象、值对象、聚合根

    一.DDD中的领域对象.值对象.聚合根 参考地址: DDD-快速理解聚合根.实体.值对象的区别和联系_王瑞学习笔记-CSDN博客聚合根.实体.值对象的关系:1.实体具有ID,生命周期,状态用值对象描述 ...

  8. DDD微服务架构设计第三课 DDD领域中的聚合、工厂和仓库、限界上下文

    05 聚合.仓库与工厂:傻傻分不清楚 上一讲,我们知道了,要将领域模型最终转换为程序设计,可以落实到 3 种类型的对象设计,即服务.实体与值对象,然后进行一些贫血模型与充血模型的设计思路.但这远远不够 ...

  9. 聚合(根)、实体、值对象精炼思考总结

    1.      聚合根.实体.值对象的区别? 从标识的角度: 聚合根具有全局的唯一标识,而实体只有在聚合内部有唯一的本地标识,值对象没有唯一标识,不存在这个值对象或那个值对象的说法: 从是否只读的角度 ...

最新文章

  1. 赠书 | Python 预测股票价格,竟然这么简单
  2. 辽宁师范大学计算机科学与技术在哪个校区,辽宁师范大学有几个校区及校区地址 哪个校区最好...
  3. 关于AUC计算公式推导
  4. 【2017-04--28】Winform中ListView控件
  5. 你必须懂的 T4 模板:深入浅出
  6. 【鲲鹏来了】手把手教你在鲲鹏上使用编程语言——Java、Python
  7. 一些简单的例子让你在Java中能更好的学习并理解循环结构(1)!
  8. close wait 过多原因_time_wait 详解和解决方案
  9. mysql5.5启动报错:The server quit without updating PID file ([FAILED]localhost.localdomain.pid)....
  10. jQuery包裹节点用法完整示例
  11. 华为手机计算机小游戏,华为手机怎么玩自带小游戏 | 手游网游页游攻略大全
  12. Xcode12 兼容iOS14 及下载链接
  13. regsvr32注册dll或ocx错误0x80040201的原因
  14. java自画快递单,使用画图功能绘制快递单,并调用打印机打印
  15. 前端 利用html实现分页切换效果
  16. JS初学者使用jQuery开发一款弹幕射击游戏
  17. java-net-php-python-java作业批改系统的设计PPT计算机毕业设计程序
  18. 一台双u的服务器和一台单u的服务器性能能高一半吗,单机柜供电能力提升后,选择1U还是2U?...
  19. 深度学习数据增强数据扩增方法
  20. 2011, 完全用 GNU/Linux 工作

热门文章

  1. 【PR+AE模板插件预设】大气唯美漂亮光斑图文视觉特效展示zipvideohive-17282693-rotating-slides
  2. 在ubuntu16.04上使用源码安装caffe2
  3. SQL Server练习经典题及其详解
  4. 安装golang 火焰图
  5. 视频剪辑软件哪个好【资源分享】
  6. 关于QQ音乐sign参数的获取
  7. 大家期待已久的Photoshop 2021终于推出了
  8. [项目记录]MC核心功能
  9. SQL 语句大全(1)
  10. ABP+AdminLTE+Bootstrap Table权限管理系统第二节--在ABP的基础做数据库脚本处理