2011-03-28 51 views
2

我們終於建立了一個領域模型。域模型包括用於將域對象鬆散耦合到持久性的接口。然而,我想知道域模型對象應該如何耦合到一起。域模型應該如何耦合?所有聚合根都應該成爲接口嗎?

是否訂單點到客戶或到ICustomer

This post提到積極分離對象的問題,並似乎阻止「與[接口]過度」。然而,我不明白我如何才能真正單元測試我的領域實體,除非我能嘲笑他們依賴的其他實體,這需要鬆耦合。

我也不確定想要一個可以換出塊的域模型有多逼真。

回答

1

我不介意在單元測試中使用的混凝土合作者時,合作者:

1)具有一套全面的單元測試,明確規定了其行爲。

2)安排不難。

3)不利用外部資源(或break any of these related guidelines)。

我們一直都在使用框架類(例如DateTimestring) - 除非聚合的子代異常複雜,否則您也應該可以信任它。

0

域模型包括將域對象鬆散耦合到持久性的接口。

持久性持續存在您的對象。它知道你的對象以堅持它們。從模型中去除持久性並不會給你任何東西。域中的任何更改都必須反映在持久層中。當執行DDD時,您將與域專家一起確定無處不在的語言,然後在代碼中對其進行表示。我還沒有看到領域專家提到接口。通過識別您的域中的正確概念來解耦模型中的AR。您可能爲某些域服務定義了接口,但請確保它們是您域中的真實服務提供商,而不是您錯過的一些概念。

我也不確定想要一個可以換出片段的域模型有多逼真。

你是對的,這是不現實的。您可能會將某個服務提供商的實施交換,但AR中的實體?我不這麼認爲。

+1

我知道我的持久層將被耦合到dm。這是你想要遠離的另一種方式:將你的DM與你的持久性結合起來。但是我將如何測試一切是否耦合在一起? – 2011-03-28 23:55:48

+1

建議不要在AR內部存在持久性組件。這就是說,如果您的Order AR具有ICustomerRepository依賴關係,則應該返回並重新考慮這一點。 – 2011-03-29 08:08:32

+0

至於測試,你應該測試你的實體作爲一個單位,與他們的依賴實體和VO。如果它們看起來相互關聯,那麼將[SOLID](http://en.wikipedia.org/wiki/Solid_(object-oriented_design))原則應用於您的實體可能會有所幫助。 – 2011-03-29 08:14:46

0

當你做DDD時,你不想「真正地去耦實體」。您應該首先將您的域模型劃分爲應該分離的聚合。在Aggregates內部,不需要模擬任何東西,因爲Aggregate應該被視爲單元測試的「單元」。

此外,將盡可能多的行爲移動到Value Object將幫助您使域模型可測試,因爲Value Objects(根據定義,它是不可變的)非常易於測試。

+0

當你說我的聚合應該分離時,你是什麼意思?我的聚合被構建成這樣:一個聚合結束,另一個開始,從而使得持久化和刪除容易理解(1個每個agg)。但是,在習慣示例中,我看到Order集合直接引用了Customer集合。 – 2011-03-30 16:45:42

相關問題