国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

關(guān)于聚合根,領(lǐng)域事件的那點事---深入淺出理解DDD

這篇具有很好參考價值的文章主要介紹了關(guān)于聚合根,領(lǐng)域事件的那點事---深入淺出理解DDD。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

作者:京東物流 趙勇萍

前言

最近有空會跟同事討論DDD架構(gòu)的實踐落地的情況,但真實情況是,實際中對于領(lǐng)域驅(qū)動設(shè)計中的實體,值對象,聚合根,領(lǐng)域事件這些戰(zhàn)術(shù)類的實踐落地,每個人理解依然因人而異,大概率是因為這些概念還是有一些抽象,同時有有別于傳統(tǒng)的MVC架構(gòu)開發(fā)。

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

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

一個簡單的demo業(yè)務(wù)場景

話不多說,我先拋出我自己假設(shè)的一個業(yè)務(wù)場景,就是我們熟知的電商網(wǎng)站下單購物的場景。具體細節(jié)如下:

1. 實體:

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

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

2. 值對象:

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

3. 領(lǐng)域事件:

? 訂單創(chuàng)建事件:當用戶下單時觸發(fā)該事件,包含訂單信息、商品信息等數(shù)據(jù)。

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

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

4. 聚合根:

? 商品聚合根:包含商品實體和相關(guān)的值對象,負責(zé)商品的創(chuàng)建、修改、查詢等操作。

? 訂單聚合根:包含訂單實體和相關(guān)的值對象,負責(zé)訂單的創(chuàng)建、修改、查詢等操作。

5. 對外接口服務(wù):

? 創(chuàng)建訂單接口:用戶提交購買請求后,系統(tǒng)創(chuàng)建相應(yīng)的訂單,并觸發(fā)訂單創(chuàng)建事件。

? 支付訂單接口:用戶完成支付后,系統(tǒng)更新訂單狀態(tài),并觸發(fā)訂單支付事件。

? 發(fā)貨接口:商家發(fā)貨后,系統(tǒng)更新訂單狀態(tài),并觸發(fā)訂單發(fā)貨事件。

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

該demo中,商品和訂單是兩個核心領(lǐng)域概念,分別由對應(yīng)的聚合根負責(zé)管理。同時,通過定義領(lǐng)域事件,實現(xiàn)了不同業(yè)務(wù)場景下的數(shù)據(jù)更新和通知。最后,對外提供了一組簡單的接口服務(wù),方便系統(tǒng)的使用和擴展。

demo的java代碼實現(xiàn)

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

  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. 領(lǐng)域事件類

//訂單創(chuàng)建領(lǐng)域事件
public class OrderCreatedEvent {
    private Order order;
    private List orderItems;

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


//訂單支付領(lǐng)域事件
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);
        // 觸發(fā)訂單創(chuàng)建事件 
        DomainEventPublisher.publish(new OrderCreatedEvent(order, orderItems));
    }

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

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

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

總結(jié)

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

1. 聚合根

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

聚合根是一個對象,它代表一組相關(guān)聯(lián)的對象的整體。在聚合根內(nèi)部,可以包含多個實體對象和值對象。聚合根通??梢酝ㄟ^唯一標識符來進行識別和訪問。它是整個聚合的管理者,負責(zé)維護聚合之內(nèi)的一致性,并協(xié)調(diào)各個實體對象之間的關(guān)系。聚合根通常具有豐富的行為和操作,可以對聚合內(nèi)部的對象進行復(fù)雜的操作。

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

2. 領(lǐng)域事件

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

在DDD中,領(lǐng)域事件通常由三個部分組成:

  1. 事件名稱:這個名稱應(yīng)該能夠簡潔明了地描述事件所代表的業(yè)務(wù)意義。

  2. 相關(guān)數(shù)據(jù):這些數(shù)據(jù)包含了事件發(fā)生時與事件相關(guān)的所有信息。例如,在一個電子商務(wù)系統(tǒng)中,如果訂單被提交,則訂單信息以及買家和賣家的信息都應(yīng)該包括在該事件中。

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

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

總之,領(lǐng)域事件是DDD架構(gòu)中非常重要的概念,它可以幫助我們更好地理解業(yè)務(wù)過程,設(shè)計出更加符合實際需求的系統(tǒng),并提高系統(tǒng)的可維護性和可擴展性。文章來源地址http://www.zghlxwxcb.cn/news/detail-427063.html

到了這里,關(guān)于關(guān)于聚合根,領(lǐng)域事件的那點事---深入淺出理解DDD的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • less預(yù)處理語言的運用之-變量拼接那點事

    less預(yù)處理語言的運用之-變量拼接那點事

    less語法的技巧總結(jié),很基礎(chǔ),熟練掌握后能提高我們在大型項目中的開發(fā)效率 遞歸 less連接符與import 關(guān)注我的個人公眾號,獲取更多前后端開發(fā)經(jīng)驗知識

    2024年02月16日
    瀏覽(33)
  • 軟件工程:帕金森定律,項目工期的那點事兒

    軟件工程:帕金森定律,項目工期的那點事兒

    hi,我是熵減,見字如面。 在軟件開發(fā)中,你是否遇到過這種情況: 團隊要開發(fā)一個簡單的購物車應(yīng)用,項目預(yù)期時間是2周工期。負責(zé)開發(fā)的工程師默認利用完整的2周時間來完成任務(wù)。在第一周,工程師會認為任務(wù)很輕松,有充足的時間來完成任務(wù),所以會采取氣定神閑的

    2023年04月17日
    瀏覽(21)
  • 開發(fā)那點事(十六)從零開始搭建一個NFT數(shù)字藏品平臺

    開發(fā)那點事(十六)從零開始搭建一個NFT數(shù)字藏品平臺

    寫在前面的話 從6月初到七月研究了將近一個月NFT 區(qū)塊鏈這方面的東西,從啥都不會到了解原理,總算是有點成果了,在這里分享給大家。 核心大綱 百度超級鏈開放網(wǎng)絡(luò)(Solidity語言) 集成openzeppelin中的ERC721合約快速完成合約開發(fā) Springboot 作為后臺開發(fā)語言調(diào)用線上合約 通

    2024年01月16日
    瀏覽(37)
  • Bootstrap.yml那點事
Spring Cloud 配置中心多環(huán)境配置

    Bootstrap.yml那點事 Spring Cloud 配置中心多環(huán)境配置

    加載順序 若application.yml 和bootstrap.yml 在同一目錄下:bootstrap.yml 先加載 application.yml后加載,bootstrap.yml 用于應(yīng)用程序上下文的引導(dǎo)階段。bootstrap.yml 由父Spring ApplicationContext加載。 配置區(qū)別 bootstrap是spring cloud的配置上下文加載。由spring-cloud-context包加載。引入依賴 具體加載類

    2023年04月08日
    瀏覽(28)
  • 關(guān)于《櫻花映射(Sakura Frp)開服務(wù)器的那件事》的教程

    關(guān)于《櫻花映射(Sakura Frp)開服務(wù)器的那件事》的教程

    櫻花映射~~~免費-穿,輕松-透~~~ 打??!我不是來打廣告的! 只是很多小伙伴,在面臨服務(wù)器的對外開放時,遇到挺多麻煩事,不知道如何來解決公網(wǎng)ip的問題 解決方法是有的,很多,而且還要花錢。?? 辦法一:如果是在家想開一個服務(wù)器,和小伙伴們聯(lián)機游玩一些游戲時,

    2024年02月05日
    瀏覽(16)
  • 深入淺出關(guān)于go web的請求路由

    深入淺出關(guān)于go web的請求路由

    最近重新接觸Go語言以及對應(yīng)框架,想借此機會深入下對應(yīng)部分。 并分享一下最近學(xué)的過程很喜歡的一句話: The limits of my language mean the limits of my world. by Ludwig Wittgenstein 我的語言之局限,即我的世界之局限。 首先來介紹一下什么是路由。 路由是指確定請求應(yīng)該由哪個處理程

    2024年01月19日
    瀏覽(26)
  • DDD進階_領(lǐng)域事件是什么?如何開展領(lǐng)域事件驅(qū)動開發(fā)工作?

    DDD進階_領(lǐng)域事件是什么?如何開展領(lǐng)域事件驅(qū)動開發(fā)工作?

    DDD從入門到精通,系列文章傳送地址,請點擊本鏈接。 ? 目錄 一、什么是領(lǐng)域事件 二、如何識別領(lǐng)域事件 三、領(lǐng)域事件的數(shù)據(jù)一致性 四、領(lǐng)域事件分類 1、微服務(wù)內(nèi)的領(lǐng)域事件 2、微服務(wù)之間的領(lǐng)域事件 五、領(lǐng)域事件案例 六、領(lǐng)域事件總體架構(gòu)圖 1. 事件構(gòu)建和發(fā)布 2、事

    2024年02月15日
    瀏覽(20)
  • 【Prism系列】Prism事件聚合器

    【Prism系列】Prism事件聚合器

    我們知道MVVM指的就是Model ViewModel 與 View,之前為了做到業(yè)務(wù)邏輯和前臺徹底分離,我們使用了Command命令,將界面的的輸入或者是某些控件的事件,轉(zhuǎn)化為命令。這樣業(yè)務(wù)邏輯就從View搬到了ViewModel。很明顯這個傳遞方向是View -》ViewModel。 ? ? ? ? 但是現(xiàn)在有個一個需求是需要

    2024年02月06日
    瀏覽(18)
  • 05.領(lǐng)域驅(qū)動設(shè)計:掌握領(lǐng)域事件,解耦微服務(wù)的關(guān)鍵

    05.領(lǐng)域驅(qū)動設(shè)計:掌握領(lǐng)域事件,解耦微服務(wù)的關(guān)鍵

    目錄 1、概述 2、領(lǐng)域事件 2.1 如何識別領(lǐng)域事件 1.微服務(wù)內(nèi)的領(lǐng)域事件 2.微服務(wù)之間的領(lǐng)域事件 3、領(lǐng)域事件總體架構(gòu) 3.1 事件構(gòu)建和發(fā)布 3.2 事件數(shù)據(jù)持久化 3.3 事件總線 (EventBus) 3.4 消息中間件 3.5 事件接收和處理 4、案例 5、總結(jié) 1、概述 在事件風(fēng)暴(Event Storming)時,我們

    2024年02月22日
    瀏覽(18)
  • 高德地圖api2.0點聚合及點標記事件

    在使用高德地圖API的過程中,發(fā)現(xiàn)2.0版本的點聚合和之前版本的使用上有很大的區(qū)別,在此做一下點聚合的使用以及點標記的事件的記錄。 在2.0之前的版本,MarkerClusterer插件的使用如下: 而2.0版本對MarkerClusterer進行了改動 在2.0版本中,markerClusterOptions去掉了minClusterSize 集合

    2024年02月13日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包