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) 是一個非常重要的概念。
圖片
它定義了一個明確的領域邊界,在這個邊界內,領域模型有著一致的業務語義和規則。
簡單來說,限界上下文就是將一個復雜的領域劃分成多個小的、可管理的子域,每個子域都有自己獨立的模型。
領域服務
封裝一些領域相關的操作,不屬于任何實體、或值對象。
當一個操作涉及多個聚合時,可以使用領域服務來協調它們。
比如:我們有一個電商系統,其中涉及到訂單、產品和庫存...等概念。
當用戶下單時,我們需要檢查庫存是否充足,如果充足則創建訂單,否則拒絕訂單。
這個過程涉及到多個聚合(訂單、產品)之間的交互,關注領域模型內部的業務邏輯,是領域層的核心實現。