伴随着微服务的广泛应用和实践,DDD 领域驱动设计被更多的开发者认可,作者作为 DDD 领域驱动设计的初学者,结合自身实践积累 DDD 领域驱动设计的一点点经验和认知,分享给大家。

本次分享内容有:

  1. 聚合的创建;
  2. 如何定义聚合的边界;
  3. 聚合的设计原则。

欢迎大家拍砖。

小编在 2016 年初次接触领域驱动设计,可能因为之前没有留意,感觉它还不怎么被大家认可,实践 1 年多的时间以来,伴随着业务对微服务的渴求,也越来越多的看到有关微服务的文章里在提倡采用 DDD 领域驱动设计来实现模型设计,架构设计。领域驱动设计包括战略建模(即架构设计)和战术建模(即模型设计)。战术模型中包含领域,子域,限界上下文,聚合,实体,值对象,领域服务,领域事件,模块,工厂,资源库等等。本 chat 的核心是分享领域驱动设计中战术模型设计的聚合,实体的设计,这也是采用 DDD 最为核心的内容,分为以下几个方面:

  1. 什么是聚合
  2. 如何创建聚合
  3. 聚合的设计原则

什么是聚合?

首先谈什么是领域,小编第一次分享这个话题的时候,有人问到什么是领域?小编被问到了,让百科解决下吧,领域,一种专门活动或事业的范围、部类或部门。例如,一个电商系统,一个在线教育平台等都是一个领域,领域中存在问题空间和解决问题空间,问题空间由子域组成,解决问题空间则由多个限界上下文,即一组特定的软件模型。我们的战术模型设计也就产生在每个限界上下文的范围内。聚合是一种特殊的实体,实体的概念是:一个唯一的东西,并且可以再相当长的一段时间内持续地变化;聚合包装一组高度相关的对象,作为一个数据修改的单元。聚合最外层的对象称为聚合根,它是一个实体。 聚合根划分出一个清晰的边界,聚合根外部的对象,不能直接访问聚合根内部对象,如果需要访问内部对象,必须首先访问聚合根,再导航到聚合的内部对象。

如何创建聚合?

根据聚合的定义我们可以获取以下信息:

  1. 聚合要有唯一标识;
  2. 一段时间内持续变化;
  3. 组装高度相关的对象;

创建一个新聚合时,我们希望通过构造函数来初始化足够多的实体状态,哪些内容需要传给构造函数呢?唯一标识,能够唯一的确定一个对象;对象的一个或多个不变条件,不变条件即使在整个实体生命周期中都必须保持事务一致性的状态。比如用户必须有名字,性别。或者说,如果实体的不变条件要求改实体所包含的对象都不能为 null 状态,或者由其他状态计算所得,那么这些状态需要作为参数传递给构造函数。 并通过修饰符(private,default,protect,public)来保证对象数据的一致性和不变性。另外,创建聚合时,聚合内部通过验证的方式来保证数据的有效性。所以聚合中会提供一些验证方法,验证一般有属性验证,整体对象验证,组合对象验证等。

聚合的设计原则

  1. 聚合内事务一致性
  2. 设计尽可能的小聚合
  3. 通过唯一标识引用其它聚合
  4. 聚合外使用最终一致性
  5. 优先使用值对象
  6. 聚合中避免使用依赖注入
  7. 迪米特法则

1、聚合内事务一致性

即一个业务规则内,该规则应该总是保持一致的。事务一致性可分为立即性,原子性。聚合边界之内的所有内容组成了一套不变的业务规则,任何操作都不能违背这些规则。边界之外的任何东西与该聚合都是不相关的。因此,聚合表达了与事务一致性边界相同的意思。在一个事务中只能修改一个聚合实例,这是设计聚合的重要经验原则,也是业务为什么要使用聚合的原因。

2、设计尽可能的小聚合

聚合的设计尽量小到不可再拆分,聚合的修改要保证在一个事务边界内,大聚合中很难保证,聚合的事务原子一致性也只能通过最终一致性来保证,大聚合在查询时需要加载的数据,涉及到的实体较多,会降低查询的性能。

3、通过唯一标识引用其他聚合

引用聚合和被引用聚合不可以在同一个事务中进行修改。如果你试图在单个事务中修改多个聚合,这往往意味着此时的一致性边界是错误的。发生这样的情况通常是因为我们遗漏了某些建模点或者尚未发现通用语言中的某个概念。如订单中只会留有货品的 ID。

4、聚合外使用最终一致性

经过一段时间后要求能访问到更新后的数据,则是最终一致性。任何跨聚合的业务规则都不能总是保持处于最新状态。通过事件处理、批处理或者其它的更新机制,我们可以在一定时间之内处理好依赖。这个原则的意思是说:聚合内事务一致性,聚合之间最终一致性。

5、优先使用值对象

我们应该尽量的将聚合根所包含的其它聚合建模成值对象,而不是实体。在不至于对模型或基础设施造成明显影响的情况下,采用值对象全部替换的方式是最好的选择。(值对象,只作为数据传输对象,无状态变化,且一旦创建不再修改)

6、聚合中避免使用依赖注入

在一个高吞吐量、高性能的领域中,内存吃紧,垃圾回收周期漫长,那么我们就不应该给系统增加不必要的负担。比如,我们可以在调用聚合命令方法之前查找到所依赖的对象。当然,以上只是告诫大家不要在聚合中注入资源库和领域服务(资源库,负责数据存储对接存储系统;领域服务,负责聚合间的业务逻辑处理)。

7、迪米特法则

迪米特法则:强调了“最小知识”原则。在客户端对象使用服务对象时,它应该尽量少的知道服务对象的内部结构。客户端对象不应该知道任何关于服务对象属性的信息。客户端对象可以根据表层接口调用服务对象的命令方法。

本次的 chat 简单的分享下聚合的概念,如何创建,需要遵循的原则。下次的 chat 为大家解惑:为什么要用?与现有的模型有什么区别?什么样的系统适合采用 DDD?


本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。

阅读全文: http://gitbook.cn/gitchat/activity/5b42f12ab840d242d3ee2d75

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App , GitChat 专享技术内容哦。

DDD 战术模型之聚合相关推荐

  1. DCI架构是如何解决DDD战术建模缺点的?

    摘要:将DCI架构总结成一句话就是:领域对象(Object)在不同的场景(Context)中扮演(Cast)不同的角色(Role),角色之间通过交互(Interactive)来完成具体的业务逻辑. 本 ...

  2. DDD 战术设计开源实践

    DDD 至少30年以前,一些软件设计人员就已经意识到领域建模和设计的重要性,DDD这一名词,由埃里克·埃文斯(Eric Evans)在2003发表的<领域驱动设计>一书提出.这本书理论性极 ...

  3. 应用程序框架实战十八:DDD分层架构之聚合

    前面已经介绍了DDD分层架构的实体和值对象,本文将介绍聚合以及与其高度相关的并发主题. 我在之前已经说过,初学者第一步需要将业务逻辑尽量放到实体或值对象中,给实体"充血",这样可以 ...

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

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

  5. NS3学习记录(四)--加入新模型及聚合Aggregate

    1.官方描述(聚合的描述) 在ns-2中已经被广泛使用的继承和多态,它们被用来扩展协议模型,正是这种强力的认知才促成了NS-3的对象聚合系统.例如,特例化的TCP版本,如RenoTcpAgent就是通 ...

  6. java ddd聚合,DDD(五)--集合、聚合根

    1.引言 聚合,字面意思就很简洁明了,是把领域对象聚合在一起,并维护领域对象之间的关系. 聚合其实就是一个在不改变原有实体的情况下将若干实体聚集起来. 2.为什么要聚合呢 在开发中很多实体有着多个一对 ...

  7. JAVA架构之路(DDD架构模型)

    DDD(domain-driven design)领域驱动设计.虽然名字看上去有点新,其实也是内容也是我们常见的,它也可以说微服务思想的一个范畴. 领域驱动设计,这里的领域,可能是一块功能,一项技术, ...

  8. 3天我把DDD业务领域建模、数据库、聚合彻底撸干净了!

    听说,很多采用了微服务架构也不能的解决问题,都去用 DDD(领域驱动设计) 的思想去指导微服务的实践了. 最近我在和一些开发人员.技术大佬交流,大家有一个普遍的感受: DDD作为一套架构方法,近几年在 ...

  9. 深入理解DDD中的聚合

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

最新文章

  1. 修改oracle数据库默认时间格式
  2. 数据结构 排序 java_Java数据结构之排序---希尔排序
  3. TensorFlow 2.0.0-RC0版发布,专注于简单性与易用性
  4. 树莓派开机运行python脚本_【树莓派】开机自启动脚本方法之一(.Desktop文件)...
  5. hdu 4810 Wall Painting
  6. 中兴路西藏北路到浦东国际机场路线(ddmap20100114)
  7. 【Oracle】搭建DataGuard
  8. Java Spring boot 企业微信点餐系统
  9. WSS2.0 服务器启用SQL代理的解决过程
  10. R语言学习笔记:路径设置与安装包
  11. PCS7串级PID如何连线控制汽包水位三冲量
  12. 有人在远程使用计算机是什么意思,如何远程控制计算机,计算机远程控制有什么用途...
  13. 如何轻松关闭华为云中的服务和资源
  14. 创客(米思奇编程)-03-传感器
  15. 多种方式实现字幕滚动效果
  16. TS+M3U8+directshow流媒体播放器 简介
  17. Dev-C++5.11游戏创作之简易小炸弹
  18. 锁定计算机按键精灵运行,最新按键精灵脚本代码大全 按键精灵命令运行方法...
  19. Firefox OS应用程序入门
  20. 牛顿法为什么是二阶的

热门文章

  1. 电路原理02 电阻、独立源、受控源
  2. 数据挖掘-决策树算法的R实现
  3. Python编曲实践(九):如何计算并估计音乐的调性(大/小调+主音)?Krumhansl-Schmuckler调性分析算法的原理与实现
  4. iOS wifi认证
  5. C++数组能开多大?
  6. 阿里云 centos安装oracle 11g 完全图解
  7. springboot项目在外部tomcat运行出现的问题
  8. 武汉音乐学院计算机音乐作曲,武汉音乐学院作曲系6部学生作品入围2019年中国大学生计算机设计大赛决赛...
  9. linux 系统迁移 固态硬盘,系统迁移
  10. 科目二考试的只言片语