從我能感知到約 聚合根概念,我想訂購 類應該是一個aggreagrte根 訂單行。
是的,OrderLine應該很可能在Order根下,因爲OrderLine可能在父Order之外沒有任何意義。
我應該硬編碼在我的UI /服務類
可能不是新的訂單行() 聲明,儘管這往往是如何發生的,它是由工作。正如我所看到的那樣,問題在於對象構造經常發生在不同的上下文中,並且驗證約束根據上下文而不同。
我是否應該在Order類中定義一個包含 參數的方法,如productID,數量等 ?
如:
public OrderLine AddOrderLine(Product product, int Quantity ...)
這是做這件事。注意我使用了Product類而不是ProductId。有時候一個比另一個更好。我發現我出於各種原因而使用了很多 - 有時候我有這個ID,並且沒有很好的理由來拉取聚合根,有時我需要另一個根來驗證操作。
我這樣做的另一種方法是爲孩子實現一個自定義集合。
所以我必須:
order.OrderLines.Add(product, quantity);
這感覺多了幾分自然的或面向對象,特別是如果實體根有它避免了雜波很多孩子集合。
order.AddOrderLine()
,order.AddXXX()
,order.AddYYY()
,order.AddZZZ()
與
order.OrderLines.Add()
,order.ZZZs.Add()
,order.YYYs.Add()
而且,如果我想從UI 刪除 硬編碼實例或Order類使用DI。什麼 將是最好的辦法呢?
這將是工廠模式的教科書案例。我將這樣一個工廠注入到我的自定義集合中,以支持那些Add()
方法中的實例化。
我不認爲order.OrderLines.Add是更多的面向對象。有一個OO東西叫封裝。如果你的班上有很多XXX,ZZZ,YYY,它可以重新設計它(好的OO設計往往有許多小物體)。你可以谷歌封裝集合的好處,避免火車殘骸(流暢的接口是另一種情況)。 – 2011-11-29 11:57:39