我们终于建立了一个领域模型。域模型包括用于将域对象松散耦合到持久性的接口。然而,我想知道域模型对象应该如何相互耦合。
Order是指向Customer还是ICustomer ?
这篇文章提到了积极解耦对象的问题,并且似乎不鼓励“过度使用 [接口]”。但是,除非我可以模拟它们所依赖的其他实体,否则我看不到如何真正对我的域实体进行单元测试,这需要松散耦合。
我也不确定想要一个可以交换部分的域模型有多现实。
我们终于建立了一个领域模型。域模型包括用于将域对象松散耦合到持久性的接口。然而,我想知道域模型对象应该如何相互耦合。
Order是指向Customer还是ICustomer ?
这篇文章提到了积极解耦对象的问题,并且似乎不鼓励“过度使用 [接口]”。但是,除非我可以模拟它们所依赖的其他实体,否则我看不到如何真正对我的域实体进行单元测试,这需要松散耦合。
我也不确定想要一个可以交换部分的域模型有多现实。
当协作者:
1) 有一套全面的单元测试,清楚地说明它的行为。
2) 不难安排。
3) 不利用外部资源(或违反任何这些相关准则)。
我们一直使用框架类(例如,DateTime
或string
)来执行此操作——除非聚合的子级异常复杂,否则您也应该能够信任它。
在做 DDD 时,您不想“真正解耦实体”。您应该首先将域模型划分为应该解耦的聚合。在 Aggregates 内部不需要模拟任何东西,因为 Aggregate 应该被视为单元测试的“单元”。
此外,将尽可能多的行为转移到值对象将帮助您使域模型可测试,因为值对象(根据定义,它们是不可变的)非常容易测试。
域模型包括用于将域对象松散耦合到持久性的接口。
持久性会保留您的对象。它知道您的对象以便持久保存它们。将持久性与模型解耦不会给您任何东西。域中的任何更改都必须反映在持久层中,
在进行 DDD 时,您需要与领域专家一起识别普遍存在的语言,然后您将其用代码表示。我还没有看到领域专家提到界面。通过识别领域中的正确概念来解耦模型中的 AR。您可能为某些域服务定义了接口,但请确保它们是您域中的真正服务提供者,而不是您错过的某些概念。
我也不确定想要一个可以交换部分的域模型有多现实。
你是对的,这不现实。您可能会为某个服务提供商交换实现,但 AR 中的实体?我不这么认为。