共计 2037 个字符,预计需要花费 6 分钟才能阅读完成。
佛,在信徒眼里是佛,是心愿;在工艺品厂里,对于工人来说,就是一个活,是工作对象,是支出的起源;对于物流公司来说,是货,是责任担当,是运输的标的。
不同的事件主题关注的业务事件是不同,畛域模型也是不同的。
在不同的畛域模型中,对立语言。
事件风暴
事件风暴是一种疾速摸索简单业务畛域和对领域建模的实际。
事件风暴从畛域关注的业务事件登程,通过团队的充沛探讨,对立语言,最终找到畛域模型。
如何确定畛域关注的业务事件
在通用语言中存在“如果 A 产生,咱们就须要做到 B。”,这样的表述,那么 A 就能够定义成为一个畛域事件。
畛域事件的命名个别采纳“产生事件的对象名称 + 实现动作的过来模式”的模式,这有点相似用户故事的形容。其实用户故事就能够看作是一个畛域事件,只是用户故事转换成业务事件时,须要依据业务畛域对立语言。
如何发展事件风暴
大部分的材料都是站在全局的高度去做事件风暴,将整个零碎一起进行事件拆分,划分畛域模型。
这样做当然没错,然而理论开发过程中,咱们往往 1: 短少领域专家;2: 短少足够是工夫来做畛域剖析,事件风暴。这往往导致事件风暴成为实践,而短少实际。
从我个人观点来看,架构是一直演进的,业务始终在变动,代码也始终在批改,那么,咱们就能够从业务点登程,从一个需要登程,做事件风暴。
筹备工作
必不可少的便当贴,凋谢的空间,大白板。
全员参加,包含业务,产品,开发,测试,UI。
外围概念
事件风暴将零碎拆分为不同的元素,用不同色彩的便当贴示意。
对立语言
对立语言十分重要,是沟通的终点,如果一个业务内,包含业务方,产品,开发之间对于概念的表述不对立,会造成沟通不顺畅,甚至呈现背道而驰的景象。因为后期咱们是从单个需要登程,可能对立语言定义进去的概念并不精确,或者在命名上有争议,不用介意,对立语言除了精确形容业务对象以外,更次要的性能是上下文的沟通和传递,只有上下文是对立的,业务就能够顺利开展,代码也能够精确编写。如果后续其余需要减少变更,发现之前定义的名称不精确,概念上批改过去就能够了。
事件风暴过程
辨认畛域事件
事件风暴以辨认畛域事件开始。书写畛域事件的规定是应用被动语态,依照事件倒退程序贴在白板上。
遇到有争议的事件,不用过多纠结,先标记成热点事件,后续能够重点探讨。
事件个别由名次和动词组合而成,例如:订单已创立;地址已填写。
留神:用户的前端操作不是事件,例如:用户提交订单,用户提交表单;这些只是为事件提供数据。
辨认参与者
事件一共有四种参与者:
- 角色:触发事件的人
- 策略:触发事件的规定
- 内部零碎
- 事件:即以后事件的前置事件
留神:策略是规定,但规定不是策略。策略是规定 + 定时器的组合。策略会触发事件,但规定不会。
辨认限界上下文
从两个方向辨认限界上下文:
- 纵向:辨认事件流中的事件,假使相邻两个事件的关系较弱,或者体现了两个非常明显的阶段,就能够对其进行宰割。
- 横向:梳理是有的事件,依据组成事件的名词和动词去发现事件之间的相关性(雷同、类似的名词),而后去提炼一个整体的概念。
限界上下文蕴含场景,角色,流动,常识和能力,不蕴含 UI 局部。
限界上下文能够由不间断的事件组成。
限界上下文在命名的时候应用名词来定义。
辨认限界上下文遵循的准则
- 繁多抽象层次准则
每个限界上下文从概念上应该尽量处于对立抽象层次,不能嵌套。
- 正交准则
限界上下文之间不能相互影响,相互蕴含。
{% img /images/ddd/event4.jpg %}
辨认上下文映射
通过事件风暴:
- 首先辨认跨界线界上下文之间相邻事件的关系。
- 事件之间是否存在间接触发的关系(参与者为前置事件),须要确定这两个事件所述的限界上下文。
- 判断这两个事件所属的限界上下文,谁是次要的。次要的上下文就是上游。通常,前置事件为上游,或是事件的发布者。
上游调用上游。
事件依赖关系为单向依赖.
防止上游应用上游的的畛域模型(尊奉者模式),由上游来定义参数上和返回值,上游依据状况来决定是否须要定义防腐层。
一般来说,事件如果由本人的角色参与者(角色,策略,内部零碎),就与前置事件脱离来关系。
畛域剖析建模
一个事件只能有一个写模型,如果呈现多个写模型,要么就是这几个写模型存在蕴含关系,要么就是写模型脱漏了对应的事件。
对于读模型,要留神它属于那个限界上下文,如果不是以后上下文,则:
定义本人的读模型,通过防腐层进行转换,尽量不要投合上游
应用 ID 值对象(用于建设关联)(根本类型偏执)
读模型和写模型就是畛域模型对象
辨认聚合
- 针对畛域分享模型,梳理模型对象之间的关系(继承,合成,聚合,依赖,无关系)
- 确定畛域模型对象是实体还是值对象
- 将具备继承或合成关系的畛域模型对象放在一个聚合边界内
- 依据聚合的实质(概念完整性,概念独立性,不变量 Invariant,事务一致性)梳理聚合
代码实现
角色构造型
DomainService 来协调单个畛域模型 / 值对象无奈实现的业务性能,次要是数据长久化,内部接口调用获取数据等
AppService 则负责业务编排
Factory 负责封装简单的创立逻辑,用于创立畛域对象