DDD落地实践
记录 实习期间 参与项目的领域驱动设计落地
以下记录主要以本人开发的取号模块为例,每个阶段的目标不同,而每个阶段和上一阶段有着紧密的联系。
DDD几部曲
战略设计
重业务。深刻认识业务,根据业务划分限界上下文(业务边界),理清不同业务之间的优先级,实现上下文的分类。
事件风暴。梳理出业务中相关名词。例如预防接种流程中的(取号单、取号机、取号用户信息、取号设置、排号队列、排号规则、工作台、叫号、重叫、过号、完成、异常完结、叫号设置、外设)
统一名词。项目相关人员对同一名词达成一致理解。同时利用这些名词作为后续设计的指导。
战术设计
重实现。根据限界上下文和事件风暴中得出的统一名词,构建领域模型。
理清重要概念(以落地的六边形架构为例):
-
值对象:没有业务表达,没有唯一标识,只是数据载体,值不同则值对象不同【取号用户信息(其中包含预约信息)】
-
实体:具有唯一标识的,内聚属性校验【取号单(取号单id)、取号设置(取号设置id)】,也对应到了数据库表
-
聚合根:一组相关对象集合,作为整体被外部访问,有业务表达(领域中只有一个实体,那这个实体本身就是聚合根)【取号机(动作-生成取号单;保存/查看取号设置)】
-
领域服务:整个领域的行为【生成取号单的行为、保存/查看取号设置的行为】
-
应用服务:组合多个领域服务数据,为领域服务组装数据【拿到防腐层中调用的外部服务数据-用户基本信息(数据中心)、预约信息(预约服务)】,不体现。应用服务之间没有相互依赖
-
防腐层:作为对接外部的接口,从外部服务获取数据【领域层的external包中的接口,对应external模块中的接口实现,其实现中注入了外部服务,通过接口与外部服务解耦】
领域建模
to be continue…