女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2024-09-23 15:27 ? 次閱讀

前言

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

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

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

一個(gè)簡(jiǎn)單的demo業(yè)務(wù)場(chǎng)景

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

1. 實(shí)體:

? 商品:擁有唯一標(biāo)識(shí)、名稱(chēng)、價(jià)格、庫(kù)存等屬性。

? 訂單:擁有唯一標(biāo)識(shí)、下單時(shí)間、狀態(tài)等屬性。訂單包含多個(gè)訂單項(xiàng)。

2. 值對(duì)象:

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

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

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

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

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

4. 聚合根:

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

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

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

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

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

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

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

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

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

好了,有了以上我們對(duì)業(yè)務(wù)場(chǎng)景的充分剖析,確定了子域,接下來(lái)我們?cè)搶?xiě)我們的代碼。

1.商品實(shí)體類(lèi):

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

2. 訂單實(shí)體類(lèi)

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

3. 訂單項(xiàng)實(shí)體類(lèi)

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

4. 地址值對(duì)象

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

5. 領(lǐng)域事件類(lèi)

//訂單創(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é)

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

1. 聚合根

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

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

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

2. 領(lǐng)域事件

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

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

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

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

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

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

總之,領(lǐng)域事件是DDD架構(gòu)中非常重要的概念,它可以幫助我們更好地理解業(yè)務(wù)過(guò)程,設(shè)計(jì)出更加符合實(shí)際需求的系統(tǒng),并提高系統(tǒng)的可維護(hù)性和可擴(kuò)展性。

?審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8941

    瀏覽量

    153197
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2984

    瀏覽量

    106860
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4886

    瀏覽量

    70255
  • ddd
    ddd
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    3014
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    自學(xué)FPGA好書(shū)《深入淺出玩轉(zhuǎn)FPGA》

    ://www.kx-soc.com/)編著,是初學(xué)Verilog理論不錯(cuò)的好書(shū)。(2)《深入淺出玩轉(zhuǎn)FPGA》吳厚航北京航空航天大學(xué)出版工程師項(xiàng)目實(shí)戰(zhàn)演習(xí)的案例分析,更具實(shí)踐價(jià)值。(3)《Verilog 數(shù)字系統(tǒng)設(shè)計(jì)教程》夏宇聞
    發(fā)表于 02-03 11:11

    深入淺出玩轉(zhuǎn)fpga PDF教程和光盤(pán)資源

    深入淺出玩轉(zhuǎn)FPGA,作者吳厚航,由北京航空航天大學(xué)出版社出版。本書(shū)收集整理了作者在FPGA學(xué)習(xí)和實(shí)踐中的經(jīng)驗(yàn)點(diǎn)滴。書(shū)中既有日常的學(xué)習(xí)筆記,對(duì)一些常用設(shè)計(jì)技巧和方法進(jìn)行深入探討;也有很多生動(dòng)的實(shí)例
    發(fā)表于 02-27 10:45

    深入淺出AVR

    深入淺出AVR,一本書(shū)。
    發(fā)表于 07-15 12:02

    深入淺出玩轉(zhuǎn)FPGA

    深入淺出玩轉(zhuǎn)FPGA
    發(fā)表于 07-21 09:21

    深入淺出ARM7

    深入淺出ARM7
    發(fā)表于 08-18 10:12

    HDMI技術(shù)深入淺出

    HDMI技術(shù)深入淺出
    發(fā)表于 08-19 10:52

    深入淺出Android

    深入淺出Android
    發(fā)表于 08-20 10:14

    深入淺出Android

    深入淺出Android
    發(fā)表于 04-26 10:48

    深入淺出安防視頻監(jiān)控系統(tǒng)

    深入淺出安防視頻監(jiān)控系統(tǒng)深入淺出安防視頻監(jiān)控系統(tǒng)
    發(fā)表于 05-22 19:28

    深入淺出AVR

    深入淺出AVR
    發(fā)表于 08-23 10:10

    深入淺出數(shù)據(jù)分析

    深入淺出數(shù)據(jù)分析,有需要的朋友下來(lái)看看。
    發(fā)表于 01-15 14:22 ?0次下載

    STM32深入淺出之新手

    STM32深入淺出之新手,很好的單片機(jī)學(xué)習(xí)資料。
    發(fā)表于 03-21 17:43 ?128次下載

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

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

    深入淺出數(shù)字信號(hào)處理

    深入淺出數(shù)字信號(hào)處理
    發(fā)表于 12-07 20:14 ?611次閱讀

    深入淺出理解阻抗匹配

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