Skip to the content.

首页

Domain-Driven Design 领域驱动设计

总结自《阿里技术专家详解DDD系列》


DDD架构DEMO


一、Domain Primitive(DP)

一个在特定领域里,拥有精准定义的、可自我验证的、拥有行为的 Value Object

就好像 Integer、String 是所有编程语言的 Primitive 一样,在 DDD 里, DP 可以说是一切模型、方法、架构的基础,而就像 Integer、String 一样, DP 又是无所不在的。

使用:

1.将隐性的概念显性化
2.将隐性的上下文显性化
3.封装多对象行为

定义:

  1. DP 是一个传统意义上的 Value Object,拥有 Immutable 的特性 。
  2. DP 是一个完整的概念整体,拥有精准定义。
  3. DP 使用业务域中的原生语言。
  4. DP 可以是业务域的最小组成部分、也可以构建复杂组合。

常见使用场景:

二、应用架构

传统的三层分层结构:UI 层、业务层、和基础设施层。上层对于下层有直接的依 赖关系,导致耦合度过高。

传统架构违背的原则:单一性原则(对象或类应该只有一个变更的原因)、依赖反转原则(代码中依赖抽象,而不是具体的实现)、开放封闭原则(开放扩展,封闭修改)

几个概念:

领域模型

改造方法:

  1. 用 Domain Primitive 封装跟实体无关的无状态计算逻辑。
  2. 用 Entity 封装单对象的有状态的行为,包括业务校验等。
  3. 用 Domain Service 封装多对象逻辑。

改造后的DDD架构:

Entity、Data Object (DO) 和 Data Transfer Object (DTO):

Data Object (数据对象,同 Persistent Object 、PO):

实际上是我们在日常工作中最常见的数据模型。在 DDD 的规范里,DO 应该仅仅作为数据库物理表格的映射,不能参与到业务逻辑中。为了简单明了,DO 的字段类型和名称应该和数据库物理表格的字段类型和名一一对应。

Entity(实体对象):

是我们正常业务应该使用的业务模型,它的字段和方法应该和业务语言保持一致,和持久化方式无关。也就是说,Entity 的生命周期应该仅存在于内存中,不需要可序列化和可持久化。

DTO(传输对象):

主要作为 Application 层的入参和出参,DTO 的价值在于适配不同的业务场景的入参和出参,避免让业务对象变成一个万能大对象。

DTO Assembler:

在 Application 层,Entity 到 DTO 之间的转化器。

Data Converter:

在 Infrastructure 层,Entity 到 DO 之间的转化器。

三、架构设计要点

Aggregate(聚合根):

复杂一点的领域里,通常主实体会包含子实体,如主子订单模型、商品/SKU 模型、跨子订单优惠、跨店优惠模型等,这时候主实体就需要起到聚合根的作用。

实体:

领域服务:

领域事件: