【发布时间】:2015-09-03 12:50:42
【问题描述】:
我正在尝试使用一些 DDD 概念来改进我的设计。目前我有 4 个简单的 EF 实体,如下图所示:
有多个TaskTemplates,每个都存储多个TasksItemTemplates。 TaskItemTemplates 包含各种信息(描述、图像、默认处理时间)。
用户可以基于TaskTemplate 创建新的具体Tasks。在当前实现中,这还将为每个TaskItemTemplate 创建一个TaskItem,但将来可能会选择一些相关的TasksItemTemplates。
我想知道如何在 DDD 中为这个需求建模。不允许从TaskItem 到TaskTemplateItem 的引用,因为TaskTemplateItem 不是聚合根。但是如果没有这个引用,就不可能得到TaskTemplateItem 的属性。
当然,我可以删除引用并将所有属性从TaskTemplateItem 复制到TaskItem,但实际上我喜欢通过更新TaskTemplateItems 来更新TaskItems 的可能性。
更新:Task(Item)Template 更新的预期行为
应该可以编辑TaskTemplate 和TaskItemTemplate 和例如修复名称或描述中的拼写错误。我希望这些更改会反映在Task/TaskItem 中。
另一方面,如果 DefaultProcessingTime 被修改,这不应该改变 TaskItem 的持久化 DueDate。
在我当前的实现中,无法将TaskItemTemplates 添加/删除到持久的TaskTemplate,但这将是一个很好的改进。我将如何实现这样的事情?在TaskTemplate 和TaskItemTemplate 之间添加另一个实体TaskTemplateVersion?
更新 2:TaskItemTemplateId 为 ValueObject
再次阅读 Vaughn 的幻灯片后,我认为通过简单的修改,我的模型根据 DDD 是正确的:
不幸的是,我真的不明白,为什么这个设计更好(更好吗?)。好的,TaskItemTemplates 不会有不必要的数据库查询。但另一方面,在使用 TaskItem 时,我几乎需要一个 TaskItemTemplate,因此一切都变得更加复杂。我不能再做类似的事情了
public string Description
{
get { return this.taskItemTemplate.Description; }
}
【问题讨论】:
-
顺便说一句,不要将 DDD 实体与 EF 实体混淆。
-
我知道在完美世界中,DDD 和 EF 之间存在差异。但是也有很多人试图将 DDD 概念直接应用于 EF。我将 DevExpress XAF 与直接基于实体生成的视图一起使用。因此,不可能开发出真正的 DDD 解决方案,但我认为仍然可以使用它来改进我的设计。
-
@krombi 你能解释一下当他们的
TaskItems被修改时你对TaskItems的期望会发生什么吗? -
我更新了我的问题