1

如果我的領域模型不應該知道/關心存儲庫,那麼像.UpdateOrder(...)這樣的一些行爲如何封裝一個CRUD-Update與存儲庫的接口?通過域名服務?通過域封裝的持久性,還是通過Repository持久化?

好的,那麼我的Repository有一個有效的CRUD更新,與我的.UpdateOrder(...)一起使用。沒關係。但我不希望有人在存儲庫上使用Update方法,我希望他們通過實體上的行爲(使用UpdateOrder()代替)。我更喜歡像我的領域模型滿足不變式的方式 - 通過它的設計(私有屬性等) - 我的知識庫而不是公開了一種替代方法來「更新」/堅持實體。

這是一個簡單的訪問修飾符問題,由我在Repo public中沒有Update方法解決。或者有更好的答案?請幫我DDD忍者。

+0

UpdateOrder做了什麼,它需要什麼樣的參數?它實際上是用實體中的值更新持久存儲嗎? – 2010-12-02 16:53:10

+0

UpdateOrder是業務模型的行爲。除了封裝域邏輯和最後它需要保持更改的狀態之外,它並不重要。 – 2010-12-03 13:15:07

回答

3

在DDD的嚴格序列將是:

var entityRepository = MyServiceLocator.Get<IEntityRepository>(); 
var myEntity = entityRepository.Load(<some criteria>); 
myEntity.Change(something); 
entityRepository.Save(myEntity); 

存儲庫是總是負責檢測/堅持所有的實體內的變化。

(順便說一句,我假設你的實體是一個聚合根)

2

如果您的域模型不包括持久性,那麼它不包括存儲東西的操作。如果你的實體是來自領域模型的東西,那麼它就沒有業務堅持自己。

你說:

這很好。但我不希望有人 使用Update方法上 庫,我希望他們去通過 行爲的實體

但我認爲這是錯誤的。你的域對象沒有更多的責任來堅持自己比自己打印自己,在屏幕上自己畫自己,等等。你的域名類不應該有一個UpdateOrder方法

現在,您可能不想將原始資源庫(從您的持久化實現層)暴露給其他代碼,但這僅僅意味着將其包裝在合適的東西中。這聽起來像你有需要討論持久性的代碼,所以要弄清楚它需要處理什麼級別的話語,並向其展示合適的接口。