0

在DDD中,我想知道什麼時候應該使用域名事件?是否有適合使用域名事件的情況推薦?是否只在最終一致可接受的情況下?何時使用域名事件?

比方說,在一個包含Product,Order,OrderLine的在線商店示例中,一個Order包含多個OrderLine。一個OrderLine與產品有1對1的關係,當我創建一個訂單時,同時我需要扣除產品中的可用金額。有2種方式,我知道:

  1. 在OrderService(應用服務):

    • 創建一個新的訂單,插入數據庫
    • 因爲,爲了各個訂單,獲得產品相關聯OrderLine,請致電Product.UpdateQuantity()
    • 將所有產品保存到數據庫
    • 注意:對我來說,應用程序服務看起來像這裏的大部分工作(創建訂單,獲取產品,更新p roduct),這是可以接受的嗎?
  2. 在OrderService:

    • 創建一個新的訂單,插入數據庫
    • 生成事件OrderCreated
    • 事件處理程序觸發,調用Product.UpdateQuantity()
    • 注意:產品數量不保證立即更新

在現實生活中,哪種方式更受青睞? 而在這兩種情況下,如何處理產品數量的併發更新?如果數量與用戶看結賬屏幕的時間不一致,通知用戶失敗?

非常感謝

+0

「現實生活」和DDD屬於同一句話嗎?當我閱讀時,我喜歡那本書,但感覺就像是其中的一個想法。 – duffymo

+0

哈哈,我沒有機會看到現實生活中的DDD應用程序,所以我不能說它們是否相互排斥,但即使它不是,我想有很多概念,我可以從中學習 –

回答

0

我認爲你的決定需要圍繞着工作單位和ACID。

如果此服務擁有數據庫並且表示用戶訪問此信息的唯一接口,那麼該方法需要是由服務作爲一個事務管理的單個工作單元。

我不明白你提供的兩個例子之間的區別。

當我在亞馬遜上訂購商品時,我希望我的訂單的產品數量能夠立即更新並與我的產品數量保持一致。我不知道他們的庫存系統是「後來趕上」還是成爲我的交易的一部分。我不希望我的訂單失敗,因爲他們的庫存系統有問題。我可以看到他們可能有哪些機制讓我的訂單持久耐用,並讓庫存系統稍後(也許是一個隊列)迎頭趕上。但這是服務可能不需要知道的細節。