DDD:引用非聚合根

时间:2015-09-03 12:50:42

标签: domain-driven-design

我尝试使用一些DDD概念来改进我的设计。目前我有4个简单的EF entites,如下图所示:

enter image description here 每个TaskTemplates多个TasksItemTemplates存储多个TaskItemTemplatesTasks包含各种信息(描述,图像,默认处理时间)。

用户可以根据TaskTemplate创建新的具体TaskItem。在当前的实现中,这也将为每个TaskItemTemplate创建一个TasksItemTemplates,但将来有可能选择一个相关的TaskItem

我想知道如何在DDD中建模这个要求。不允许从TaskTemplateItemTaskTemplateItem的引用,因为TaskTemplateItem不是聚合根。但是如果没有此引用,则无法获取TaskTemplateItem的属性。 当然,我可以删除引用并将所有属性从TaskItem复制到TaskItems,但实际上我希望通过更新TaskTemplateItems来更新TaskTemplate

更新:任务(项目)模板更新的预期行为

应该可以修改TaskItemTemplateTask/TaskItem,例如在名称或描述中修复Typos。我希望这些更改能够反映在TaskItemTemplates中。 另一方面,如果修改了DefaultProcessingTime,则不应更改TaskItem的持久DueDate。

在我目前的实施中,无法向持久性TaskTemplate添加/删除TaskTemplateVersion,但这将是一个很好的改进。我该如何实现这样的东西?在TaskTemplateTaskItemTemplate之间添加另一个实体public string Description { get { return this.taskItemTemplate.Description; } }

Update2:TaskItemTemplateId为ValueObject

再次阅读Vaughn的幻灯片之后,我想通过一个简单的修改,根据DDD,我的模型是正确的:

enter image description here

不幸的是我真的不明白,为什么这个设计更好(它更好吗?)。好的,对于TaskItemTemplates,不会有不必要的数据库查询。但另一方面,在使用TaskItem时,我几乎需要一个TaskItemTemplate,因此一切都变得更复杂。我不能再做像

这样的事了
{{1}}

1 个答案:

答案 0 :(得分:1)

根据您在TaskItemTaskItemTemplate下方列出的属性,我会说它们应该是值对象而不是实体。因此,如果没有理由(基于您的问题中没有信息)将它们设为实体,请将它们更改为不可变值对象。

使用该解决方案,您只需通过复制其数据即可从TaskItem创建TaskItemTemplate

关于您描述的更新方案,它会看到以下解决方案:

  • TaskItem是根据TaskItemTemplate的特定版本创建的。使用TaskItem
  • 记录该版本
  • TaskTemplate负责更新其项目并跟踪其版本。
  • 如果模板发生更改,请通知所有从模板派生的Task,如果需要立即采取措施。如果您只是希望能够在以后“拉入”模板更改(而不是在模板更改时执行操作),则只需比较版本。

要做出明智的决定,充分了解不变性的利弊是非常重要的。只有这样,您才会看到将事物建模为值对象的好处。我发现非常有价值的一个主题来源是Eric Lippert's series on immutability

另外,Vaughn Vernon所着的“em> Implementing DDD ”这本书很好地解释了价值对象和实体的概念。