3

我有一個關於實現DDD和存儲庫模式的問題。 我應該修改存儲庫中的實體嗎?DDD。我應該修改存儲庫中的實體嗎?

比方說,我有一個訂單,並希望將該訂單標記爲完成。 正如我所見,我有兩種選擇。

    1.
var order _orderRepository.GetById(1); 
order.Finish(); 
_orderRepository.Update(order); 

...其中的變化是堅持在更新調用數據庫。

2.

var order _orderRepository.GetById(1); 
var finishedOrder = _orderRepository.Finish(order); 

...其中的變化是堅持在完成調用數據庫。

使用其中一種方法是否有優勢?什麼是DDD這樣做的方式?

+0

第一個是正確的方法。 – Jehof

+0

@Jehof我也這麼認爲,但爲什麼我應該更喜歡第一個呢? –

+1

原因我認爲不是存儲庫負責將訂單標記爲已完成。它直到一個命令(當使用CQRS)或一個DomainService來做到這一點 – Jehof

回答

5

您不應該在存儲庫中對其進行修改。

原因是存儲庫負責抽象出持久性(即讀取/寫入數據存儲)。

如果您還使其對某些業務邏輯負責,則違反了單一職責原則。

如果您正在進行自動化測試,這也意味着您必須執行集成測試以確保數據庫通信/映射工作,然後執行單元測試以驗證您在其中引入的業務邏輯。

它看起來很平常。但第一次違反原則時,這只是微不足道的。但是一個違規通常會導致另一個違規,最終導致另一個應用程序不易維護:)

一個類有混合職責的應用程序也很難導航。每次要更新某個功能時,都必須通過所有層來查找實際邏輯的完成位置。

0

使用應用程序層協調一個或多個域對象的行爲,域對象應執行所有狀態更改,最後回購應將這些更改持久保存到數據庫或存儲域的狀態的任何位置。