1. 聚合根、实体、值对象的区别?对象
从标识的角度:生命周期
聚合根具备全局的惟一标识,而实体只有在聚合内部有惟一的本地标识,值对象没有惟一标识,不存在这个值对象或那个值对象的说法;引用
从是否只读的角度:数据
聚合根除了惟一标识外,其余全部状态信息都理论上可变;实体是可变的;值对象是只读的;ant
从生命周期的角度:模型
聚合根有独立的生命周期,实体的生命周期从属于其所属的聚合,实体彻底由其所属的聚合根负责管理维护;值对象无生命周期可言,由于只是一个值;管理
2. 聚合根、实体、值对象对象之间如何创建关联?
聚合根到聚合根:经过ID关联;
聚合根到其内部的实体,直接对象引用;
聚合根到值对象,直接对象引用;
实体对其余对象的引用规则:1)能引用其所属聚合内的聚合根、实体、值对象;2)能引用外部聚合根,但推荐以ID的方式关联,另外也能够关联某个外部聚合内的实体,但必须是ID关联,不然就出现同一个实体的引用被两个聚合根持有,这是不容许的,一个实体的引用只能被其所属的聚合根持有;
值对象对其余对象的引用规则:只需确保值对象是只读的便可,推荐值对象的全部属性都尽可能是值对象;
3. 如何识别聚合与聚合根?
明确含义:一个Bounded Context(界定的上下文)可能包含多个聚合,每一个聚合都有一个根实体,叫作聚合根;
识别顺序:先找出哪些实体多是聚合根,再逐个分析每一个聚合根的边界,即该聚合根应该聚合哪些实体或值对象;最后再划分Bounded Context;
聚合边界肯定法则:根据不变性约束规则(Invariant)。不变性规则有两类:1)聚合边界内必须具备哪些信息,若是没有这些信息就不能称为一个有效的聚合;2)聚合内的某些对象的状态必须知足某个业务规则;
例子分析1:订单模型
Order(一 个订单)必须有对应的客户信息,不然就不能称为一个有效的Order;同理,Order对OrderLineItem有不变性约束,Order也必须至少有一个OrderLineItem(一条订单明细),不然就不能称为一个有效的Order;另外,Order中的任何OrderLineItem的数量都不能为0,不然认为该OrderLineItem是无效 的,同时能够推理出Order也多是无效的。由于若是容许一个OrderLineItem的数量为0的话,就意味着可能会出现全部 OrderLineItem的数量都为0,这就致使整个Order的总价为0,这是没有任何意义的,是不容许的,从而致使Order无效;因此,必需要求 Order中全部的OrderLineItem的数量都不能为0;那么如今能够肯定的是Order必须包含一些OrderLineItem,那么应该是通 过引用的方式仍是ID关联的方式来表达这种包含关系呢?这就须要引出另一个问题,那就是先要分析出是OrderLineItem是不是一个独立的聚合 根。回答了这个问题,那么根据上面的规则就知道应该用对象引用仍是用ID关联了。那么OrderLineItem是不是一个独立的聚合根呢?由于聚合根意 味着是某个聚合的根,而聚合有表明着某个上下文边界,而一个上下文边界又表明着某个独立的业务场景,这个业务场景操做的惟一对象老是该上下文边界内的聚合 根。想到这里,咱们就能够想一想,有没有什么场景是会绕开订单直接对某个订单明细进行操做的。也就是在这种状况下,咱们 是以OrderLineItem为主体,彻底是在面向OrderLineItem在作业务操做。有这种业务场景吗?没有,咱们对 OrderLineItem的全部的操做都是以Order为出发点,咱们老是会面向整个Order在作业务操做,好比向Order中增长明细,修改 Order的某个明细对应的商品的购买数量,从Order中移除某个明细,等等相似操做,咱们历来不会从OrderlineItem为出发点去执行一些业 务操做;另外,从生命周期的角度去理解,那么OrderLineItem离开Order没有任何存在的意义,也就是说OrderLineItem的生命周 期是从属于Order的。因此,咱们能够很确信的回答,OrderLineItem是一个实体。
例子分析2:帖子与回复的模型,作个对比,以便更好地理解。
不 变性分析:帖子和回复之间有不变性规则吗?彷佛咱们只知道一点是确定的,那就是帖子和回复之间的关系,1:N的关系;除了这个以外,咱们看不到任何其余的 不变性规则。那么这个1:N的对象关系是一种不变性规则吗?不是!首先,一个帖子能够没有任何回复,帖子也不对它的回复有任何规则约束,它甚至都不知道自 己有多少个回复;再次,发表了一个回复和帖子也没有任何关系;其次,发表回复对帖子没有任何改变;从业务场景的角度去分析,咱们有发表帖子的场景,有发表 回复的场景。当在发表回复的时候,是以回复为主体的,帖子只是这个回复里所包含的必要信息,用于说明这个回复是对哪一个帖子的回复。这些都说明帖子和回复之 间找不出任何不变性约束的规则;由于帖子和回复都有各自独立的业务场景的须要,因此能够很容易理解它们都是独立的聚合根;那也很容易知道该如何创建他们之 间的关联了,可是咱们要尽可能减小关联,因此只保留回复对帖子的关联便可;帖子没有任何须要去保存一个回复的ID的列表;那么你可能会说,当我删除一个帖子 后,回复应该是没有存在的意义的呀?不对,不是没有存在的意义,而是删除了帖子后致使了回复对帖子的关联信息的缺失,致使数据不一致。这是由于帖子和回复 之间有一种必然的联系(1:N),回复必定会有一个对应的帖子;可是回复有其本身的生命周期,不该该随着帖子的删除而级联删除。这种状况下,若是你删除了 帖子,就致使回复也成为了一条无效的数据;因此,咱们绝对不容许删除任何聚合根,由于一旦你删除了聚合根,那就意味着与该聚合根相关的其余任何聚合根都会 有外键引用缺失的问题,会致使整个领域模型数据的不一致;因此,永远都不要删除聚合根;