领域驱动设计之聚合与聚合根

对实体与值对象等进行关联设计后,就应该进行聚合的划分以及聚合根的确定。

首先我们需要明确为什么需要进行聚合的划分?

原来我们的系统对领域划分的最小单位通常是模块,比如客户信息管理模块、雇员信息管理模块。但模块的划分对于设计来说,还是显得粒度太粗。

一.聚合与聚合根

1.定义了对象之间清晰的关系和边界,并实现领域模型的内聚。我的理解是:一个聚合内的对象才具有强关联,对象的关联设计应该是针对一个聚合中的实体与实体或实体与值对象之间。(比如一个下订单的领域中,订单(实体)、订单项(实体)以及订单状态(值对象)应该为一个聚合,订单与订单项有关联、订单与订单状态有关联)。

2.必须将聚合作为一个修改数据的单元。

3.一个聚合必须有一个聚合根,根是聚合中的一个实体,通常聚合中其他实体需要依赖于聚合根,其他实体不能没有聚合根而单独存在,从业务的角度来看它是没有单独存在的意义的。比如在第1点中,订单应该是聚合根,因为订单项与订单状态两个对象在没有订单的情况下是没有意义的。

4.对一个聚合中实体的访问或操作,必须通过这个聚合的聚合根开始,主要的目的是这样可以保证不变的一致性规则。比如在第1点中,订单有一个订单总额属性,订单项有一个当前项金额的属性,有一个规则是订单总额为订单项总额之和,如果其他聚合绕过订单聚合根而直接操作订单项实体,则操作后,很难保证不变的一致性规则,如果通过订单聚合根操作订单项,而订单聚合根负责业务规则的一致性,这样就能够保证了。所以聚合根的一个重要职责是负责维护本聚合内部的一致性。

5.在对聚合进行查询或操作时,整个聚合是作为一个整体,不能直接查询聚合内部某个非根的对象。

二.识别聚合

识别聚合经过理论和实际的项目开发,我认为应该从以下几个方面进行聚合划分

1.哪些实体或值对象在一起才能够有效的表达一个领域概念。

2.对象之间是否必须保持一些固定的规则。

3.聚合不要设计太大,否则会有性能问题以及业务规则一致性的问题。

4.聚合中的实体和值对象应该具有相同的生命周期,并应该属于一个业务场景。

三.识别聚合根

1.一个聚合只有一个聚合根,聚合根是可以独立存在的,聚合中其他实体或值对象依赖与聚合根。

2.只有聚合根才能被外部访问到,聚合根维护聚合的内部一致性。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LiveEdu在线科技教育平台

10最好用的Node.js工具、插件和资料库

每一个称职的程序员都应该拥有一套极好的工具来提高自己的工作效率。在Livecoding.tv 上,那里的程序员分享了10个他们认为是最好用的工具、插件和资料库。...

362110
来自专栏SDNLAB

SDN实战团分享(二十九):Microflow性能调优分享

Hello大家好,很高兴可以在这里和大家分享一下我的个人开源项目Microflow的相关工作。 我是BII天地互连的工程师,在公司里负责SDN产品和技术的开发,...

37970
来自专栏Crossin的编程教室

答同学问(三)

Git课程因为有些事耽搁了,会尽快更新。今天先来说几个之前有人问过的关于Python的几个小问题。 1. 如何查看异常处理时except里的出错信息? 给ex...

31160
来自专栏蓝天

disuz 7.2文字常量定义文件messages.lang.php

D:\hadoop\backup\20120619221410\templates\default\messages.lang.php

12930
来自专栏mini188

openfire的组件(Component)开发

在之前的文章《Openfire阶段实践总结》中提到过一种openfire的扩展模式Compoent。本文将主要探讨对这种模式的应用与开发方法。 内部与外部组件介...

29180
来自专栏令仔很忙

【JVM调优】----内存溢出和内存泄漏

项目的开发,涉及到了服务器的运维,先来介绍下JVM相关的知识,也方便后期的使用。今天主要是说一说内存溢出和内存泄漏两件事。

13410
来自专栏IT派

Python爬虫抓取智联招聘(基础版)

运行平台: Windows Python版本: Python3.6 IDE: Sublime Text 其他工具: Chrome浏览器

19630
来自专栏我是攻城师

spark sql 快速体验调试小例子

37050
来自专栏zingpLiu

python【第十三篇】可以写一个堡垒机了

到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多人觉得,堡垒机就是跳板机,其实这个认识是不全面的,跳板功能只是...

36030
来自专栏架构师之路

58龙哥教你“如何做系统性能优化”(纯干货)

如何做系统性能优化 性能优化的目标是什么?不外乎两个: 时间性能:减小系统执行的时间 空间性能:减小系统占用的空间 一、代码优化 做代码优化前,先了解下硬件Ca...

34240

扫码关注云+社区

领取腾讯云代金券