域模型应该如何耦合?所有聚合根应该是接口吗?

时间:2011-03-28 17:32:28

标签: domain-driven-design domain-model loose-coupling

我们终于建立了一个域模型。域模型包括用于将域对象松散耦合到持久性的接口。然而,我想知道域模型对象应该如何耦合到彼此。

订单是指向客户还是指向客户

This post提到了积极地解耦对象的问题,并且似乎不鼓励“过度使用[接口]”。然而,我没有看到我如何真正单元测试我的域实体,除非我可以模拟他们依赖的其他实体,这需要松耦合。

我也不确定想要一个可以换掉片段的域模型是多么现实。

3 个答案:

答案 0 :(得分:1)

我不介意在协作者的单元测试中使用具体的协作者:

1)有一套全面的单元测试,明确说明其行为。

2)安排并不困难。

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

我们一直使用框架类(比如DateTimestring)这样做 - 除非聚合的孩子异常复杂,否则你也应该信任它。

答案 1 :(得分:0)

  

域模型包括用于将域对象松散耦合到持久性的接口。

持久性持久存储您的对象。它知道你的对象以便坚持它们。将持久性与模型分离并不能为您提供任何帮助。域中的任何更改都必须反映在持久层中,

在进行DDD时,您与域专家一起确定无处不在的语言,然后在代码中表示。我还没有看到域专家提到一个接口。通过在您的域中识别正确的概念来解耦模型中的AR。您可能为某些域服务定义了接口,但要确保它们是您域中的真实服务提供者,而不是您错过的某些概念。

  

我也不确定想要一个可以换掉片段的域模型是多么现实。

你是对的,这是不现实的。您可以交换某个服务提供商的实施,但是AR中的实体?我不这么认为。

答案 2 :(得分:0)

在做DDD时,你不想'真正解耦实体'。您应该首先将域模型划分为应该解耦的聚合。 Inside Aggregates不需要模拟任何东西,因为Aggregate应被视为单元测试的“单位”。

此外,将尽可能多的行为移动到Value Object将帮助您使您的域模型可测试,因为Value Objects(根据定义,它是不可变的)非常容易测试。