领域驱动设计之聚合与聚合根
对实体与值对象等进行关联设计后,就应该进行聚合的划分以及聚合根的确定。
首先我们需要明确为什么需要进行聚合的划分?
原来我们的系统对领域划分的最小单位通常是模块,比如客户信息管理模块、雇员信息管理模块。但模块的划分对于设计来说,还是显得粒度太粗。
一.聚合与聚合根
1.定义了对象之间清晰的关系和边界,并实现领域模型的内聚。我的理解是:一个聚合内的对象才具有强关联,对象的关联设计应该是针对一个聚合中的实体与实体或实体与值对象之间。(比如一个下订单的领域中,订单(实体)、订单项(实体)以及订单状态(值对象)应该为一个聚合,订单与订单项有关联、订单与订单状态有关联)。
2.必须将聚合作为一个修改数据的单元。
3.一个聚合必须有一个聚合根,根是聚合中的一个实体,通常聚合中其他实体需要依赖于聚合根,其他实体不能没有聚合根而单独存在,从业务的角度来看它是没有单独存在的意义的。比如在第1点中,订单应该是聚合根,因为订单项与订单状态两个对象在没有订单的情况下是没有意义的。
4.对一个聚合中实体的访问或操作,必须通过这个聚合的聚合根开始,主要的目的是这样可以保证不变的一致性规则。比如在第1点中,订单有一个订单总额属性,订单项有一个当前项金额的属性,有一个规则是订单总额为订单项总额之和,如果其他聚合绕过订单聚合根而直接操作订单项实体,则操作后,很难保证不变的一致性规则,如果通过订单聚合根操作订单项,而订单聚合根负责业务规则的一致性,这样就能够保证了。所以聚合根的一个重要职责是负责维护本聚合内部的一致性。
5.在对聚合进行查询或操作时,整个聚合是作为一个整体,不能直接查询聚合内部某个非根的对象。
二.识别聚合
识别聚合经过理论和实际的项目开发,我认为应该从以下几个方面进行聚合划分
1.哪些实体或值对象在一起才能够有效的表达一个领域概念。
2.对象之间是否必须保持一些固定的规则。
3.聚合不要设计太大,否则会有性能问题以及业务规则一致性的问题。
4.聚合中的实体和值对象应该具有相同的生命周期,并应该属于一个业务场景。
三.识别聚合根
1.一个聚合只有一个聚合根,聚合根是可以独立存在的,聚合中其他实体或值对象依赖与聚合根。
2.只有聚合根才能被外部访问到,聚合根维护聚合的内部一致性。
相关推荐
ES 聚合查询结果转换成相应的对象集合,ES 聚合查询结果转换成相应的对象集合
- 加成聚合:也称链式聚合,分为自由基聚合、阴离子聚合、阳离子聚合和配位聚合等。这类聚合反应在形成聚合物时,单体分子通过加成反应连续地串联起来。 - 缩合聚合:单体分子通过缩合反应,如脱水、脱醇或脱氨等...
一个对象可能有多个层次,也可能有多个子实体,但是这些子实体都不可能孤立存在,它们必须依附于 聚合和聚合根是领域模型里面很重要的一个概念,其实我们在从真实世界对业务对象进行识别和概念建模的时候,关注的...
在对象关系中,聚合通常由实体和值对象组成,其中实体具有唯一标识,而值对象只关注其属性值。 聚合的设计需要遵循以下原则: 1. **概念完整性**:确保聚合内的对象共享相同的业务语义和规则,形成一个完整的概念。...
面向对象编程(OOP)是现代软件工程中广泛采用的编程范式,其核心思想在于将现实世界中的事物抽象为对象,通过对象之间的交互实现复杂系统的建模与开发。在面向对象设计中,类间关系是理解和设计系统架构的关键。本文...
**聚合根**是领域模型中的一个关键组件,它是一种特殊的实体,负责管理聚合内部的实体和值对象,确保聚合的完整性。聚合是一组具有强一致性边界的对象,任何对聚合的修改都必须在一次事务中完成,以保持数据的一致性...
总结来说,"elasticsearch聚合值过滤"是Elasticsearch提供的一种高级数据分析方法,它结合了聚合和过滤,能够帮助我们根据聚合结果做出更复杂的决策和分析。通过使用管道聚合和Elasticsearch SQL,我们可以方便地...
聚合根是聚合内的主要实体,是外部对象访问聚合内其他对象的唯一入口。聚合边界应明确,外部操作只能通过聚合根进行,以保持业务规则的一致性。 领域服务:领域服务处理那些不适合放在实体中的复杂业务逻辑,或者是...
聚合根的识别1
### 数据库设计与业务实体对象到数据库表的映射关系 #### 一、数据库设计概述 数据库设计是在软件工程和信息系统领域中一个重要的环节,它涉及到如何有效地组织数据以满足特定业务需求。良好的数据库设计不仅能...
聚合中,外部对象(聚合对象)不直接包含内部对象的接口,而是持有内部对象的`IUnknown`指针。这样,外部对象可以控制内部对象的生命周期,而外部对象的客户只能通过外部对象的接口来访问内部对象。在ATL中,可以...
### HQL语法总结:实体查询详解 #### 一、实体查询概述 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以一种类似于SQL但更接近于面向对象的方式来编写查询。本文将详细介绍HQL中的实体...
在聚合中,有一个特殊的对象被称为聚合根(Aggregate Root),它是聚合的入口点,负责对外部世界提供交互接口。聚合根确保了聚合内部的状态在任何操作后都保持正确,这通常涉及到事务一致性。 聚合的基础知识包括...
**聚合关系**(Aggregation)是面向对象设计中的一个重要概念,它描述了一种“has-a”(拥有)的关系,即一个类(整体)包含另一个类(部分)的对象作为其成员变量。与组合关系相比,聚合关系更加灵活,部分对象可以...
- 然后,将具有紧密关联的实体和值对象组织到同一个聚合边界内,以维护概念完整性。 - 在这个过程中,需要不断调整聚合的边界,以找到最合适的粒度,既不过于庞大导致复杂性增加,也不过于细碎导致一致性难以维护...
总结,ArcGIS API for JavaScript 3.20的聚合功能对于处理大量点数据至关重要,它可以帮助我们有效地组织和展示地图信息。通过结合“testCluster”文件中的实际数据,我们可以进一步理解并实践这一功能,提升地图...
在外聚合中,一个对象(称为外壳对象)控制另一个对象(称为内核对象)的生命周期,而内聚合则允许两个对象互相聚合。本文将主要讨论外聚合。 外聚合实现的关键在于`IUnknown`接口的处理。`IUnknown`是所有COM接口...
对面向对象设计原则的总结,设计模式:“开-闭”原则,里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则
《Gaffer:大规模实体与关系数据库的属性聚合框架》 Gaffer,作为一款专为处理大规模实体和关系数据设计的数据库框架,以其独特的属性聚合功能脱颖而出。它将数据以图形的形式进行存储,使得节点和边可以携带丰富的...
2. **聚合**:聚合是DDD中的一个关键概念,它是一组相关对象的集合,有一个根元素,即聚合根,其他对象被称为聚合内的实体或值对象。聚合保持其内部的一致性,对外界提供统一的访问接口。例如,在订单管理中,订单是...