DDD原理最全详解(万字图文总结)

开发 架构
DDD,强调通过深入理解业务领域,并将领域知识明确地融入到系统设计中,从而来构建复杂的软件系统。DDD适用于各种复杂的业务系统,尤其适用于:业务逻辑复杂、系统规模庞大...等应用场景。


DDD

DDD,全称是“Domain-Driven Design”,翻译过来就是领域驱动设计,是一种以领域为中心的软件开发方法论。

图片图片

DDD,强调通过深入理解业务领域,并将领域知识明确地融入到系统设计中,从而来构建复杂的软件系统。

DDD适用于各种复杂的业务系统,尤其适用于:业务逻辑复杂、系统规模庞大...等应用场景。

DDD原理

DDD强调建立清晰的领域模型,使开发人员、和业务人员,能够以共同的语言进行交流。

DDD,将系统架构分为多个层次,如下图所示:

图片图片

主要会包含,如下四层:

领域层(Domain Layer)

包含业务逻辑、和领域模型,聚合了实体、和值对象...等等;

应用层(Application Layer)

负责:协调应用程序的行为,处理用户请求;

协调领域层,调用领域服务来完成用户请求。

接口层(Interface Layer)

提供用户、与系统交互的接口,比如:通过HTTP...等协议,接收用户请求。

以及,将领域模型转换为DTO(Data Transfer Object),以便于传输。

基础设施层(Infrastructure Layer)

处理数据持久化、和外部服务交...等等。

这里面,最重要的就是领域层。

领域模型

领域模型,将业务领域抽象成一个模型,这个模型包含了领域中的实体、值对象、聚合、服务...等。

图片图片

实体

具有唯一标识符的对象,代表业务中的一个重要概念,比如:用户、订单、产品...等。

图片图片

public class User {
    private String userId; // 唯一标识
    private String name;
    private String email;


    public User(String userId, String name, String email) {
        this.userId = userId;
        this.name = name;
        this.email = email;
    }


    public String getUserId() {
        return userId;
    }


    public String getName() {
        return name;
    }


    public String getEmail() {
        return email;
    }


    public void updateEmail(String newEmail) {
        this.email = newEmail;
    }
}

值对象

没有唯一标识符的对象,通常用来描述实体的特征,比如:地址、或日期...等等。

public class Address {
    private String street;
    private String city;
    private String country;
    // ... 其他属性


    // 构造方法,确保不可变性
    public Address(String street, String city, String country) {
        this.street = street;
        this.city = city;
        this.country = country;
    }


    // 只提供getter方法,不提供setter方法
}

聚合

由相关实体、和值对象,组成的集合,是数据修改、和持久化的基本单元。

public class Order {
    private Long id;
    private User customer;
    private List<OrderItem> items;
    private Address shippingAddress;
    // ... 其他属性和方法


    // 构造方法,设置聚合根
    public Order(User customer, Address shippingAddress) {
        this.customer = customer;
        this.shippingAddress = shippingAddress;
        this.items = new ArrayList<>();
    }


    public void addItem(OrderItem item) {
        items.add(item);
    }
}
  • 聚合根:Order是聚合根,负责维护聚合内部的一致性。
  • 实体:User、OrderItem都是实体。
  • 值对象:Address是值对象

限界上下文

在领域驱动设计(DDD)中,限界上下文(Bounded Context) 是一个非常重要的概念。

图片图片

它定义了一个明确的领域边界,在这个边界内,领域模型有着一致的业务语义和规则。

简单来说,限界上下文就是将一个复杂的领域划分成多个小的、可管理的子域,每个子域都有自己独立的模型。

领域服务

封装一些领域相关的操作,不属于任何实体、或值对象。

当一个操作涉及多个聚合时,可以使用领域服务来协调它们。

比如:我们有一个电商系统,其中涉及到订单、产品和库存...等概念。

当用户下单时,我们需要检查库存是否充足,如果充足则创建订单,否则拒绝订单。

这个过程涉及到多个聚合(订单、产品)之间的交互,关注领域模型内部的业务逻辑,是领域层的核心实现。

责任编辑:武晓燕 来源: mikechen的互联网架构
相关推荐

2024-08-13 15:07:20

2024-09-26 13:33:12

2024-08-30 10:29:21

2024-09-04 09:43:36

2024-07-26 10:35:00

2024-05-31 13:34:57

2021-03-16 08:21:29

Spark系统并行

2023-10-31 12:58:00

TypeScriptJavaScript

2024-08-29 10:23:42

2022-09-06 08:02:40

死锁顺序锁轮询锁

2024-08-08 13:01:53

2020-03-18 12:47:59

设计模式ERP

2020-04-16 14:40:02

MySQL数据库架构

2024-08-12 16:09:31

2020-01-15 09:53:59

MySQL缓存索引

2024-11-06 09:54:58

SpringJava开发

2017-12-07 15:34:57

数据库MySQL优化原理

2024-05-10 12:59:58

PyTorch人工智能

2021-03-18 10:04:46

数据仓库体系

2023-12-04 08:10:34

Spring循环依赖
点赞
收藏

51CTO技术栈公众号