主要内容
1:什么是Aggregate模式
2:什么是Factory模式
3:什么是Repository模式
4:factory 与 repository的关系
引言
每个领域对象都是有生命周期的,创建->销毁…等等。
主要面临2个挑战:生命周期的维护、防止陷入管理生命周期的困境
通过3个模式可以解决这些问题
什么是Aggregate模式
在复杂的模型关系中,保证对象的一致性很困难,紧密关联的对象之间是需要遵守一些固定规则,我们需要找到一个使对象间冲突较少而固定规则联系更紧密的模型
比如:汽车(entity)与轮胎,人们会通过汽车查询轮胎的使用情况。当脱离汽车这个entity,人们很可能不会关系轮胎的标识。我们可以把这种对外部无关的entity聚合在root entity里面。他的作用域和关联关系、生命周期都由root维护
这里的汽车就是aggregate root,轮胎就是aggregate内部对象
这里概念上有一些规则:
1:root entity 具有全局标识,负责维护域内对象的固定规则
2:边界内的entity 具有本地标识,域内唯一
3:aggregate外域对象不能引用除root外的 内部entity对象
4:只有root才能从数据库中直接查询获取,其他的需要关联查询
5:内部entity可以持有其他外部root的引用
6:删除操作必须一次性删除边界内所有的对象
总结:aggregate 划分一个范围,在这个范围内,生命周期的每个阶段都必须要满足一定的固定规则
什么是Factory模式
当创建一个对象或者创建整个Aggregate.很复杂,或者暴露太多的内部结构,则可以使用Factory封装
复杂对象的创建 是领域层的职责
Factory 不属于模型,但是承担了部分领域层的职责
factory有3种类型:factory method, abstract factory .builder
有些情况最好直接使用构造方法
1:这个类不是任何层次的一部分,没有通过接口实现多态
2:使用方关心实现
3:构造并不复杂
4:公共构造函数(必须是原子的,满足被创建对象的所有固定规则)
设计原则
1:原子性,一次性将所有参数传入,考虑创建失败的时候,返回什么。
2:与其参数松耦合,与其创建的对象紧耦合
什么是Repository模式
我们可以通过对象的关联关系找到对象,但是当他在生命周期的中间时候,必须要有一个起点,以遍历到一个entity或者value;
注意:当对象查询发送在entity的生命周期中间时候,查询出来的对象不是一个新对象。他只是被重建出来了,
Bad Case:
1:我们习惯构造SQL,通过基础建设层查询服务,得到的信息构造出的数据放到对象。对象成为了一个容器。这偏离了我们”领域模型“的初衷,更像是面向”数据处理“风格。
2:开发人员直接查询数据库,很可能丢失领域模型的固定规则,比如打破Aggregate边界。Entity 和value 变成了数据容器。
Good Case:
将用户的关注点拉回到模型本身,模型内再进行repository的使用封装
factory 与 repository的关系
Factory 负责处理对象生命周期开始,repository负责处理生命周期中间和结束
Factory 负责制造新对象,repository负责查找已有对象
repository可以委托factory创建新对象