关于ddd:领域驱动事件风暴

45次阅读

共计 2037 个字符,预计需要花费 6 分钟才能阅读完成。

佛,在信徒眼里是佛,是心愿;在工艺品厂里,对于工人来说,就是一个活,是工作对象,是支出的起源;对于物流公司来说,是货,是责任担当,是运输的标的。
不同的事件主题关注的业务事件是不同,畛域模型也是不同的。
在不同的畛域模型中,对立语言。

事件风暴

事件风暴是一种疾速摸索简单业务畛域和对领域建模的实际。
事件风暴从畛域关注的业务事件登程,通过团队的充沛探讨,对立语言,最终找到畛域模型。

如何确定畛域关注的业务事件

在通用语言中存在“如果 A 产生,咱们就须要做到 B。”,这样的表述,那么 A 就能够定义成为一个畛域事件。
畛域事件的命名个别采纳“产生事件的对象名称 + 实现动作的过来模式”的模式,这有点相似用户故事的形容。其实用户故事就能够看作是一个畛域事件,只是用户故事转换成业务事件时,须要依据业务畛域对立语言。

如何发展事件风暴

大部分的材料都是站在全局的高度去做事件风暴,将整个零碎一起进行事件拆分,划分畛域模型。
这样做当然没错,然而理论开发过程中,咱们往往 1: 短少领域专家;2: 短少足够是工夫来做畛域剖析,事件风暴。这往往导致事件风暴成为实践,而短少实际。
从我个人观点来看,架构是一直演进的,业务始终在变动,代码也始终在批改,那么,咱们就能够从业务点登程,从一个需要登程,做事件风暴。

筹备工作

必不可少的便当贴,凋谢的空间,大白板。
全员参加,包含业务,产品,开发,测试,UI。

外围概念

事件风暴将零碎拆分为不同的元素,用不同色彩的便当贴示意。

对立语言

对立语言十分重要,是沟通的终点,如果一个业务内,包含业务方,产品,开发之间对于概念的表述不对立,会造成沟通不顺畅,甚至呈现背道而驰的景象。因为后期咱们是从单个需要登程,可能对立语言定义进去的概念并不精确,或者在命名上有争议,不用介意,对立语言除了精确形容业务对象以外,更次要的性能是上下文的沟通和传递,只有上下文是对立的,业务就能够顺利开展,代码也能够精确编写。如果后续其余需要减少变更,发现之前定义的名称不精确,概念上批改过去就能够了。

事件风暴过程

辨认畛域事件

事件风暴以辨认畛域事件开始。书写畛域事件的规定是应用被动语态,依照事件倒退程序贴在白板上。
遇到有争议的事件,不用过多纠结,先标记成热点事件,后续能够重点探讨。
事件个别由名次和动词组合而成,例如:订单已创立;地址已填写。

留神:用户的前端操作不是事件,例如:用户提交订单,用户提交表单;这些只是为事件提供数据。

辨认参与者

事件一共有四种参与者:

- 角色:触发事件的人
- 策略:触发事件的规定
- 内部零碎
- 事件:即以后事件的前置事件

留神:策略是规定,但规定不是策略。策略是规定 + 定时器的组合。策略会触发事件,但规定不会。

辨认限界上下文

从两个方向辨认限界上下文:

  • 纵向:辨认事件流中的事件,假使相邻两个事件的关系较弱,或者体现了两个非常明显的阶段,就能够对其进行宰割。
  • 横向:梳理是有的事件,依据组成事件的名词和动词去发现事件之间的相关性(雷同、类似的名词),而后去提炼一个整体的概念。

限界上下文蕴含场景,角色,流动,常识和能力,不蕴含 UI 局部。
限界上下文能够由不间断的事件组成。
限界上下文在命名的时候应用名词来定义。

辨认限界上下文遵循的准则
  • 繁多抽象层次准则

每个限界上下文从概念上应该尽量处于对立抽象层次,不能嵌套。

  • 正交准则

限界上下文之间不能相互影响,相互蕴含。
{% img /images/ddd/event4.jpg %}

辨认上下文映射

通过事件风暴:

  • 首先辨认跨界线界上下文之间相邻事件的关系。
  • 事件之间是否存在间接触发的关系(参与者为前置事件),须要确定这两个事件所述的限界上下文。
  • 判断这两个事件所属的限界上下文,谁是次要的。次要的上下文就是上游。通常,前置事件为上游,或是事件的发布者。

上游调用上游。
事件依赖关系为单向依赖.
防止上游应用上游的的畛域模型(尊奉者模式),由上游来定义参数上和返回值,上游依据状况来决定是否须要定义防腐层。
一般来说,事件如果由本人的角色参与者(角色,策略,内部零碎),就与前置事件脱离来关系。

畛域剖析建模

一个事件只能有一个写模型,如果呈现多个写模型,要么就是这几个写模型存在蕴含关系,要么就是写模型脱漏了对应的事件。
对于读模型,要留神它属于那个限界上下文,如果不是以后上下文,则:

定义本人的读模型,通过防腐层进行转换,尽量不要投合上游
应用 ID 值对象(用于建设关联)(根本类型偏执)
读模型和写模型就是畛域模型对象

辨认聚合
  • 针对畛域分享模型,梳理模型对象之间的关系(继承,合成,聚合,依赖,无关系)
  • 确定畛域模型对象是实体还是值对象
  • 将具备继承或合成关系的畛域模型对象放在一个聚合边界内
  • 依据聚合的实质(概念完整性,概念独立性,不变量 Invariant,事务一致性)梳理聚合

代码实现

角色构造型


DomainService 来协调单个畛域模型 / 值对象无奈实现的业务性能,次要是数据长久化,内部接口调用获取数据等
AppService 则负责业务编排
Factory 负责封装简单的创立逻辑,用于创立畛域对象

正文完
 0