领域驱动设计(DDD)是一种软件系统设计方法,专注于业务领域及其逻辑。DDD将复杂的业务领域拆分为相关但独立的受限上下文(bounded contexts)。在每个上下文中,开发一个与领域专家达成一致的专用语言(Ubiquitous Language)。DDD的主要构建块:
受限上下文通常表现为通过明确定义的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,建立内部的上下文边界。
每个聚合是否总是需要一个仓库?
通常是的,但有时聚合可以作为另一个聚合的一部分完全存储,前提是它不是单独业务事务的根。