2010-12-01 52 views
7

我試圖讓我的手髒學習DDD(通過開發一個樣本電子商務網站與實體,如OrderOrderLinesProductCategories等)。 從我能理解的聚合根概念我認爲Order類應該是OrderLine的聚合根。DDD - 聚合根 - 示例訂單和訂單行

事情很順利,但是我很困惑,它定義了從UI創建訂單流。 當我想以一個訂單行添加到我的訂單對象,我應該怎麼弄/創建一個OrderLine對象的實例:

  1. 我應該硬編碼的新OrderLine()聲明,我的UI /服務類
  2. 是否應我在Order類中定義了一個類似productID,quantity等參數的方法?

另外,如果我想使用DI去除UI或Order類中的硬編碼實例,該怎麼辦。對此最好的方法是什麼?

回答

2

從我能感知到約 聚合根概念,我想訂購 類應該是一個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()方法中的實例化。

+1

我不認爲order.OrderLines.Add是更多的面向對象。有一個OO東西叫封裝。如果你的班上有很多XXX,ZZZ,YYY,它可以重新設計它(好的OO設計往往有許多小物體)。你可以谷歌封裝集合的好處,避免火車殘骸(流暢的接口是另一種情況)。 – 2011-11-29 11:57:39

2

您可以使用OrderLine Factory來獲取Orderlines的實例。您將使用傳入工廠方法的參數「新建」工廠中的OrderLine對象,然後將新實例返回給Order對象。總是嘗試隔離實例化,而不要在UI中執行。有一個問題here使用這種技術。

這是一本很棒的書,你可以在DDD找到有用的書。