精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

理論篇 關于聚合根,領域事件的那點事---深入淺出理解DDD

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-09-23 15:27 ? 次閱讀

前言

最近有空會跟同事討論DDD架構的實踐落地的情況,但真實情況是,實際中對于領域驅動設計中的實體,值對象,聚合根,領域事件這些戰術類的實踐落地,每個人理解依然因人而異,大概率是因為這些概念還是有一些抽象,同時有有別于傳統的MVC架構開發。

在此,通過小demo的方式跟大家分享一下我對DDD中戰術層級的理解,算是拋磚引玉,該理解僅代表我個人在現階段的一個理解,也可能未來隨著業務經驗深入,還會有不同的理解。

既然說是小demo,還是要從業務場景出發,也就是我最熟知的電商業務場景說起。但是該篇文章里, 我會簡化一些實際業務場景中的復雜度,通過最小顆粒度的demo,來反映實踐過程中的基本問題。

一個簡單的demo業務場景

話不多說,我先拋出我自己假設的一個業務場景,就是我們熟知的電商網站下單購物的場景。具體細節如下:

1. 實體:

? 商品:擁有唯一標識、名稱、價格、庫存等屬性。

? 訂單:擁有唯一標識、下單時間、狀態等屬性。訂單包含多個訂單項。

2. 值對象:

? 地址:擁有省、市、區、詳細地址等屬性。

3. 領域事件:

? 訂單創建事件:當用戶下單時觸發該事件,包含訂單信息、商品信息等數據。

? 訂單支付事件:當用戶完成支付時觸發該事件,包含訂單信息、支付金額等數據。

? 訂單發貨事件:當商家發貨時觸發該事件,包含訂單信息、快遞公司、快遞單號等數據。

4. 聚合根:

? 商品聚合根:包含商品實體和相關的值對象,負責商品的創建、修改、查詢等操作。

? 訂單聚合根:包含訂單實體和相關的值對象,負責訂單的創建、修改、查詢等操作。

5. 對外接口服務:

? 創建訂單接口:用戶提交購買請求后,系統創建相應的訂單,并觸發訂單創建事件。

? 支付訂單接口:用戶完成支付后,系統更新訂單狀態,并觸發訂單支付事件。

? 發貨接口:商家發貨后,系統更新訂單狀態,并觸發訂單發貨事件。

? 查詢訂單接口:用戶可以根據訂單號等條件查詢自己的訂單信息。

該demo中,商品和訂單是兩個核心領域概念,分別由對應的聚合根負責管理。同時,通過定義領域事件,實現了不同業務場景下的數據更新和通知。最后,對外提供了一組簡單的接口服務,方便系統的使用和擴展。

demo的java代碼實現

好了,有了以上我們對業務場景的充分剖析,確定了子域,接下來我們該寫我們的代碼。

1.商品實體類:

// 省略getter/setter方法
public class Product {
    private Long id;
    private String name;
    private BigDecimal price;
    private Integer stock;
}

2. 訂單實體類

// 省略getter/setter方法
public class Order {
    private Long id;
    private LocalDateTime createTime;
    private Integer status;
    private List orderItems;
}

3. 訂單項實體類

// 省略getter/setter方法
public class OrderItem {
    private Long id;
    private Product product;
    private Integer quantity;
    private BigDecimal price;
}

4. 地址值對象

// 省略getter/setter方法 
public class Address {
    private String province;
    private String city;
    private String district;
    private String detail;
}

5. 領域事件類

//訂單創建領域事件
public class OrderCreatedEvent {
    private Order order;
    private List orderItems;

    public OrderCreatedEvent(Order order, List orderItems) {
        this.order = order;
        this.orderItems = orderItems;
    }
}


//訂單支付領域事件
public class OrderPaidEvent {
    private Order order;
    private BigDecimal amount;

    public OrderPaidEvent(Order order, BigDecimal amount) {
        this.order = order;
        this.amount = amount;
    }
}

//訂單
public class OrderShippedEvent {
    private Order order;
    private String expressCompany;
    private String expressNo;

    public OrderShippedEvent(Order order, String expressCompany, String expressNo) {
        this.order = order;
        this.expressCompany = expressCompany;
        this.expressNo = expressNo;
    }
}

6. 商品聚合根

public class ProductAggregate {
    private ProductService productService;

    public void createProduct(Product product) {
        productService.create(product);
    }

    public void updateProduct(Product product) {
        productService.update(product);
    }

    public void deleteProduct(Long productId) {
        productService.delete(productId);
    }

    public Product getProductById(Long productId) {
        return productService.getById(productId);
    }
}

7. 訂單聚合根

public class OrderAggregate {
    private OrderService orderService;

    public void createOrder(Order order, List orderItems) {
        orderService.create(order);
        // 觸發訂單創建事件 
        DomainEventPublisher.publish(new OrderCreatedEvent(order, orderItems));
    }

    public void payOrder(Long orderId, BigDecimal amount) {
        orderService.pay(orderId, amount);
        // 觸發訂單支付事件
        DomainEventPublisher.publish(new OrderPaidEvent(orderService.getById(orderId), amount));
    }

    public void shipOrder(Long orderId, String expressCompany, String expressNo) {
        orderService.ship(orderId, expressCompany, expressNo);
        // 觸發訂單發貨事件 
        DomainEventPublisher.publish(new OrderShippedEvent(orderService.getById(orderId), expressCompany, expressNo));
    }

    public Order getOrderById(Long orderId) {
        return orderService.getById(orderId);
    }
}

總結

通過以上demo,對于實體和值對象,大家會很好理解,并且很直觀。但是, 我額外想重點解釋一下聚合根和領域事件的概念

1. 聚合根

從上面的demo可以看出,在合根類中,我們定義了商品和訂單的增、刪、查等操作,并且為訂單定義了創建訂單、支付訂單、發貨等業務邏輯代碼。

聚合根是一個對象,它代表一組相關聯的對象的整體。在聚合根內部,可以包含多個實體對象和值對象。聚合根通常可以通過唯一標識符來進行識別和訪問。它是整個聚合的管理者,負責維護聚合之內的一致性,并協調各個實體對象之間的關系。聚合根通常具有豐富的行為和操作,可以對聚合內部的對象進行復雜的操作。

所以說,真正的聚合根內的方法是基于充血模型封裝的,而不是僅僅是對對象的數據封裝。在聚合根中,對象不僅封裝了數據,還包含了相應的行為和業務邏輯。這意味著在一個聚合根中,對象可以自己處理自己的業務邏輯,而不需要外部的控制。就如同demo中所寫的那樣,訂單對象可能包含一些關于訂單處理和交付的方法,如確認訂單、取消訂單、發貨等。

2. 領域事件

領域事件是DDD中最重要的概念之一,他是解決子域之間耦合的重要手段,因為它們提供了一種將領域概念和業務語言轉化為代碼的方法。當一個領域事件發生時,它會觸發一些操作,這些操作可能會更改系統的狀態,也可能會導致其他領域事件的發生。通過對領域事件進行建模,我們可以更好地了解業務過程并設計出更加符合實際需求的系統。

在DDD中,領域事件通常由三個部分組成:

1.事件名稱:這個名稱應該能夠簡潔明了地描述事件所代表的業務意義。

2.相關數據:這些數據包含了事件發生時與事件相關的所有信息。例如,在一個電子商務系統中,如果訂單被提交,則訂單信息以及買家和賣家的信息都應該包括在該事件中。

3.發送者和接收者:發送者通常是觸發事件的對象,接收者則是事件處理的對象。

領域事件在DDD中有很多用途。例如,它們可以用來觸發其他業務流程、更新數據庫或通知其他子系統。它們還可以用于解決一些復雜的業務邏輯問題,例如并發、數據同步和錯誤處理等等。

總之,領域事件是DDD架構中非常重要的概念,它可以幫助我們更好地理解業務過程,設計出更加符合實際需求的系統,并提高系統的可維護性和可擴展性。

?審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8496

    瀏覽量

    150834
  • JAVA
    +關注

    關注

    19

    文章

    2957

    瀏覽量

    104544
  • 代碼
    +關注

    關注

    30

    文章

    4744

    瀏覽量

    68344
  • ddd
    ddd
    +關注

    關注

    0

    文章

    23

    瀏覽量

    2918
收藏 人收藏

    評論

    相關推薦

    自學FPGA好書《深入淺出玩轉FPGA》

    ://www.kx-soc.com/)編著,是初學Verilog理論不錯的好書。(2)《深入淺出玩轉FPGA》吳厚航北京航空航天大學出版工程師項目實戰演習的案例分析,更具實踐價值。(3)《Verilog 數字系統設計教程》夏宇聞
    發表于 02-03 11:11

    深入淺出玩轉fpga PDF教程和光盤資源

    深入淺出玩轉FPGA,作者吳厚航,由北京航空航天大學出版社出版。本書收集整理了作者在FPGA學習和實踐中的經驗點滴。書中既有日常的學習筆記,對一些常用設計技巧和方法進行深入探討;也有很多生動的實例
    發表于 02-27 10:45

    深入淺出AVR

    深入淺出AVR,一本書。
    發表于 07-15 12:02

    深入淺出玩轉FPGA

    深入淺出玩轉FPGA
    發表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發表于 08-18 10:12

    HDMI技術深入淺出

    HDMI技術深入淺出
    發表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發表于 04-26 10:48

    深入淺出安防視頻監控系統

    深入淺出安防視頻監控系統深入淺出安防視頻監控系統
    發表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發表于 08-23 10:10

    深入淺出數據分析

    深入淺出數據分析,有需要的朋友下來看看。
    發表于 01-15 14:22 ?0次下載

    STM32深入淺出之新手

    STM32深入淺出之新手,很好的單片機學習資料。
    發表于 03-21 17:43 ?128次下載

    深入淺出談多層面板布線技巧

    深入淺出談多層面板布線技巧
    發表于 12-13 22:20 ?0次下載

    深入淺出數字信號處理

    深入淺出數字信號處理
    發表于 12-07 20:14 ?522次閱讀

    深入淺出理解阻抗匹配

    深入淺出理解阻抗匹配
    的頭像 發表于 02-03 15:14 ?4078次閱讀