架构 (IT)软件架构师

什么是领域驱动设计(DDD)在架构层面,DDD的主要构建块是什么,以及如何实现上下文边界?

用 Hintsage AI 助手通过面试

答案.

领域驱动设计(DDD)是一种软件系统设计方法,专注于业务领域及其逻辑。DDD将复杂的业务领域拆分为相关但独立的受限上下文(bounded contexts)。在每个上下文中,开发一个与领域专家达成一致的专用语言(Ubiquitous Language)。DDD的主要构建块:

  • 实体(Entity):具有唯一标识符和生命周期的对象(例如,订单)。
  • 值对象(Value Object):没有唯一标识符的不可变对象(例如,送货地址)。
  • 聚合及聚合根(Aggregate & Aggregate Root):所有变更都通过聚合根进行的对象集合。
  • 仓库(Repository):用于处理聚合存储的层。
  • 服务(Service):与特定对象无关的操作。

受限上下文通常表现为通过明确定义的API或事件相互作用的独立微服务。

Java(Spring)代码示例:

// 值对象示例 @Embeddable public class Address { private String city; private String street; // ... 构造函数,equals,hashCode } // 带聚合根的实体示例 @Entity public class Order { @Id private Long id; @Embedded private Address deliveryAddress; // ... 业务方法 }

关键特性:

  • 清晰的业务领域拆分和逻辑容器化。
  • 通过隔离简化发展和扩展。
  • 提升技术语言与团队业务语言的一致性。

有陷阱的问题。

在DDD中,所有对象都是实体吗?

不是,还有值对象——它们没有唯一性,其状态完全定义身份。

Address a1 = new Address("莫斯科", "阿尔巴特"); Address a2 = new Address("莫斯科", "阿尔巴特"); System.out.println(a1.equals(a2)); // true

划分为微服务是否意味着使用DDD?

不,可以在单体应用程序中应用DDD,建立内部的上下文边界。

每个聚合是否总是需要一个仓库?

通常是的,但有时聚合可以作为另一个聚合的一部分完全存储,前提是它不是单独业务事务的根。