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

Domain driven design 域模型应该如何耦合?所有聚合根都应该是接口吗?,domain-driven-design,domain-model,loose-coupling,Domain Driven Design,Domain Model,Loose Coupling,我们终于建立了一个领域模型。域模型包括用于将域对象松散耦合到持久性的接口。然而,我想知道域模型对象应该如何相互耦合 订单是指向客户还是指向ICustomer 提到了主动去耦合对象的问题,似乎不鼓励“过分使用[接口]”。然而,我不知道如何真正地单元测试我的域实体,除非我可以模拟它们所依赖的其他实体,这需要松耦合 我还不确定,想要一个可以替换出各个部分的域模型有多现实 域模型包括用于将域对象松散耦合到持久性的接口 持久性将持久化您的对象。它知道你的目标是为了保持它们。将持久性与模型分离不会给您带来任

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

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

提到了主动去耦合对象的问题,似乎不鼓励“过分使用[接口]”。然而,我不知道如何真正地单元测试我的域实体,除非我可以模拟它们所依赖的其他实体,这需要松耦合

我还不确定,想要一个可以替换出各个部分的域模型有多现实

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

持久性将持久化您的对象。它知道你的目标是为了保持它们。将持久性与模型分离不会给您带来任何好处。域中的任何更改都必须反映在持久层中

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

我还不确定,想要一个可以替换出各个部分的域模型有多现实


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

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

1) 有一套全面的单元测试,清楚地指定了它的行为

2) 这不难安排

3) 不利用外部资源(或)


我们一直在使用框架类(比如,
DateTime
string
)-除非聚合的子级异常复杂,否则您也应该能够信任它。

在执行DDD时,您不希望“真正解耦实体”。您应该首先将域模型划分为应该解耦的聚合。在聚合内部,不需要模拟任何东西,因为聚合应该被视为单元测试的“单元”


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

我知道我的持久性层将耦合到dm。这是另一种你想要远离的方式:将你的DM和你的持久性结合起来。但是,如果所有东西都耦合在一起,我将如何进行单元测试呢?不建议在ARs中使用持久性组件。也就是说,如果您的订单AR具有ICCustomerRepository依赖关系,您应该返回并重新考虑该依赖关系。至于测试,您应该将您的实体作为一个单元进行测试,并使用它们的依赖实体和VO。如果它们看起来是相互关联的,那么将原则应用于实体可能会有所帮助。当你说我的聚合应该解耦时,你是什么意思?我的聚合是这样构建的:一个聚合的结束和另一个聚合的开始都有一条清晰的线,这样持久性和删除就很容易理解(每个聚合1个repo)。然而,在习惯示例中,我看到订单聚合直接引用客户聚合。