发布于 2026-01-06 5 阅读
0

领域驱动设计(DDD)——理解主要概念

领域驱动设计(DDD)——理解主要概念

领域驱动设计 (DDD) 是一种软件设计方法,它专注于理解业务并将其体现在代码中。通常,整洁架构与 DDD 非常契合。这是因为 DDD 采用分层分离设计,将领域层置于核心位置,这意味着领域层不依赖于任何外部组件。

主要概念

1. 领域
是指我们正在解决的业务问题。一个好的领域模型能够捕捉到关键的业务规则和行为,同时又不涉及基础设施方面的问题。因此,使用与领域/业务团队相同的语言至关重要,这可以确保开发人员(技术人员)和领域专家(非技术人员)保持一致。这就是所谓的通用语言

2. 实体和值对象

  • 实体由其唯一标识而非属性定义。即使属性发生变化,它仍然是同一个实体。
    例如,客户之所以Customer是一个实体,是因为它具有唯一的标识(客户ID或电子邮件地址),使其与其他客户区分开来。即使客户的姓名或其他详细信息发生变化,只要标识(ID或电子邮件地址)保持不变,该客户仍然是同一个实体。

  • 值对象(VO)则由其属性定义,本身不具有唯一标识。两个具有相同属性的值对象被认为是相同的。
    例如,Address两个相同的地址(同一条街道、同一座城市、同一座邮政编码)可以互换,除了属性之外,它们不具有任何唯一标识。

在一个组织中,结构可以由多个实体组成,每个实体都有其对应的价值对象。

3. 团聚体和团聚根

  • 聚合体是一组相关的领域对象,应将其视为一个整体(请参考下图以便更好地理解)。这可以确保一致性并封装业务规则。
  • 聚合根是控制对聚合中其他对象访问权限的主要实体。聚合根始终是一个实体,而绝非值对象。

聚合之间主要通过领域事件进行通信。当一个聚合中发生需要影响另一个聚合的事件时,第一个聚合会发送一个事件,其他聚合会监听并响应该事件。

聚合函数的一个更贴近现实生活的例子。在图书馆系统中,一个图书馆可以管理多本图书,每本书都有自己的属性,例如书名、作者和馆藏位置。

  • 库(聚合根)

图书馆是一个实体,因为它具有唯一的标识符(libraryId),并且代表系统中的图书集合。
它也是聚合根,这意味着它控制着对聚合中其他实体(在本例中为图书实体)的访问。

  • 书籍(实体)

图书之所以是一个实体,是因为它拥有唯一的标识(ISBN),并且代表图书馆藏书中的一本特定图书。
它是图书馆集合的一部分,其属性由图书馆进行管理。

  • 书籍详情和位置(VO)

它们是值对象,因为它们没有身份,仅由其属性定义。

4. 域名服务

有时,业务逻辑本身并不属于实体或值对象。在这种情况下,我们会使用领域服务来封装这些逻辑。

5. 领域事件

领域事件用于捕获业务领域内的重要事件。例如,当付款完成时,可以发布类似 PaymentCompleted 的事件,从而触发相关操作,例如发送电子邮件通知。

6. 有限上下文

这个概念有点抽象。限界上下文代表具有自身模型和逻辑的子域。它就像一道“边界”,将系统的不同部分分隔开来。例如,在一个在线商店中,你可能有一个用于订单管理的限界上下文,另一个用于支付处理的限界上下文,每个上下文都有自己的模型和逻辑。
不要将聚合和限界上下文混淆,聚合是更小的集合,存在于限界上下文内部,而限界上下文则有助于将整个系统中的不同业务领域区分开来。

结论

DDD 不仅仅是关于代码结构,它是一种思维方式的转变,强调与领域专家进行深度协作,并以清晰且易于维护的方式对业务逻辑进行建模。

文章来源:https://dev.to/jhonifaber/domain-driven-designddd-understanding-main-concepts-11p3