领域划分
使用DDD过程中,在面向业务变化时首先要理解业务的核心问题,有针对性进行
关注点分离出找到相对内聚的业务活动形成子问题域。子问题域内部是相对稳定的,
而子问题是很容易变化的,DDD核心在于领域边界的识别和划分
DDD是以领域为核心的,实践DDD时要先根据问题域划分出相关的领域,
描述应用需要解决什么问题。领域中存在限界上下文,它用于解决领域内
的特定问题,具备特定的职责,并存在边界。限界上下文中的领域模型具备
较高的内聚性,不同边界之间需要透过显示边界进行通信
在根据需求划分限界上下文时,可以从需求术语中提取一些概念对象,
为它们绑定一定行为。接着将高耦合的对象划分在一期,寻找它们的内在关系,
尝试形成对应的限界上下文***。最后,整理各个限界上下文的行为,验证
它是否完整、清晰和高内聚
领域模型是对领域内的关键概念及其关系的可视化表示,通过描述多个领域对象
之间的关系,实现业务功能场景在软件系统的映射,设计的关键在于抽象出限界
上下中的领域对象及其关系,并通过领域模型图表示出来
领域对象能够表达出业务意图,它们具备数据和行为,包括实体、值对象和聚合等概念
- 实体是一种对象,有唯一的标识识别自身,具备一定的生命周期,并在生命周
期内根据状态提供不同的行为 - 值对象没有唯一的标识,在领域模型中是不可变和可共享的
- 聚合由一系列实体和值对象内聚而成,表达了一个完整的领域概念
多个限界上下文需要进行集成,才能完整解决领域内的问题。在集成时需要注意不同界限
上下文中领域概念的映射和翻译,限界上下文主要由一下几种映射方式
- 合作关系: 两个上下文紧密合作的关系
- 共享内核: 两个上下文依赖部分共享的模型
- 防腐层: 一个上下文通过一些适配和转换与另一个上下文交互
- 客户方-供应方开发: 上下文之间有组织的上下游依赖
- 开放主机服务: 定义一种协议来让其他上下文对本上下文进行访问
- 遵奉者: 下游上下文只能盲目依赖上游上下文
- 发布语言: 定义开放主机的协议
- 大泥球: 混杂在一期的上下文关系,边界不清晰
- 另谋他路: 二个完全没有任何联系的上下文
一般会把领域对象的行为和数据放在一起,以达到设计上的高内聚低耦合
并屏蔽领域对象的细节,暴露公开的行为方法。当存在一些不归属于任何
领域对象的领域行为或操作时,就放在领域服务中
领域服务是领域模型的一部分,应尽量避免将过多的领域行为放在领域服务
中,一个合格的领域对象应该是行为和数据都兼并的