我尝试使用一些DDD概念来改进我的设计。目前我有4个简单的EF entites,如下图所示:
每个TaskTemplates
多个TasksItemTemplates
存储多个TaskItemTemplates
。 Tasks
包含各种信息(描述,图像,默认处理时间)。
用户可以根据TaskTemplate
创建新的具体TaskItem
。在当前的实现中,这也将为每个TaskItemTemplate
创建一个TasksItemTemplates
,但将来有可能选择一个相关的TaskItem
。
我想知道如何在DDD中建模这个要求。不允许从TaskTemplateItem
到TaskTemplateItem
的引用,因为TaskTemplateItem
不是聚合根。但是如果没有此引用,则无法获取TaskTemplateItem
的属性。
当然,我可以删除引用并将所有属性从TaskItem
复制到TaskItems
,但实际上我希望通过更新TaskTemplateItems
来更新TaskTemplate
。
应该可以修改TaskItemTemplate
和Task/TaskItem
,例如在名称或描述中修复Typos。我希望这些更改能够反映在TaskItemTemplates
中。
另一方面,如果修改了DefaultProcessingTime,则不应更改TaskItem的持久DueDate。
在我目前的实施中,无法向持久性TaskTemplate
添加/删除TaskTemplateVersion
,但这将是一个很好的改进。我该如何实现这样的东西?在TaskTemplate
和TaskItemTemplate
之间添加另一个实体public string Description
{
get { return this.taskItemTemplate.Description; }
}
?
再次阅读Vaughn的幻灯片之后,我想通过一个简单的修改,根据DDD,我的模型是正确的:
不幸的是我真的不明白,为什么这个设计更好(它更好吗?)。好的,对于TaskItemTemplates,不会有不必要的数据库查询。但另一方面,在使用TaskItem时,我几乎需要一个TaskItemTemplate,因此一切都变得更复杂。我不能再做像
这样的事了{{1}}
答案 0 :(得分:1)
根据您在TaskItem
和TaskItemTemplate
下方列出的属性,我会说它们应该是值对象而不是实体。因此,如果没有理由(基于您的问题中没有信息)将它们设为实体,请将它们更改为不可变值对象。
使用该解决方案,您只需通过复制其数据即可从TaskItem
创建TaskItemTemplate
。
关于您描述的更新方案,它会看到以下解决方案:
TaskItem
是根据TaskItemTemplate
的特定版本创建的。使用TaskItem
。TaskTemplate
负责更新其项目并跟踪其版本。Task
,如果需要立即采取措施。如果您只是希望能够在以后“拉入”模板更改(而不是在模板更改时执行操作),则只需比较版本。要做出明智的决定,充分了解不变性的利弊是非常重要的。只有这样,您才会看到将事物建模为值对象的好处。我发现非常有价值的一个主题来源是Eric Lippert's series on immutability。
另外,Vaughn Vernon所着的“em> Implementing DDD ”这本书很好地解释了价值对象和实体的概念。