Domain driven design 如何访问另一个聚合中的实体?

Domain driven design 如何访问另一个聚合中的实体?,domain-driven-design,data-modeling,Domain Driven Design,Data Modeling,我正在尝试使用DDD对场景进行建模,我们有团队、开发人员和团队应该完成的任务 基本上,我假设如下: 团队是一个可以改变的实体,例如通过让新的开发人员加入进来 开发者是一个实体,重要的是哪个开发者做了什么 故事是一个可以更改的实体,例如通过在故事中预订工作项 工作是一个价值对象,因为一旦完成,它就不能改变 很明显,团队是一个集合,包含开发人员实体。此外,故事是一个集合,包含工作值对象 因此,在开始时,我从以下代码开始: var team = Team.FoundTeam(); team.Welco

我正在尝试使用DDD对场景进行建模,我们有团队、开发人员和团队应该完成的任务

基本上,我假设如下:

团队是一个可以改变的实体,例如通过让新的开发人员加入进来 开发者是一个实体,重要的是哪个开发者做了什么 故事是一个可以更改的实体,例如通过在故事中预订工作项 工作是一个价值对象,因为一旦完成,它就不能改变 很明显,团队是一个集合,包含开发人员实体。此外,故事是一个集合,包含工作值对象

因此,在开始时,我从以下代码开始:

var team = Team.FoundTeam();
team.WelcomeDeveloper("John Doe");
team.WelcomeDeveloper("Jane Doe");

var story = Story.WriteDownStory("Publish website");
story.AssignTeam(team);
到目前为止,一切顺利。现在,在下一步中,我想为这个故事收费。基本上,这可以简单到:

story.ChargeWork(new TimeSpan(2, 0, 0));
不幸的是,现在需要将工作分配给开发人员。这就是我的问题:我如何建模?我不能做的是:

story.ChargeWork("Jane Doe", new TimeSpan(2, 0, 0));
如果有两个开发人员同名,则此操作将失败。我如何分配一个特定的开发人员实体,而不必访问它,因为开发人员只能使用团队聚合根进行访问

有什么提示吗


我的模型是完全损坏了,还是我遗漏了一些重要的东西?

您可以使用ID作为参考

var jane = developer.findByName('Jane Doe');
story.ChargeWork(jane.id, new TimeSpan(2,0,0));

您可以使用ID作为参考

var jane = developer.findByName('Jane Doe');
story.ChargeWork(jane.id, new TimeSpan(2,0,0));

只有领域专家才能告诉你模型是否损坏,但我可以告诉你一些我突然发现的事情

团队是聚合根,而不是将开发人员分组的聚合。然而,在团队范围内的上下文中,开发人员的定义可能仅仅意味着一个Id和一些相关的行为,也就是说,它不是同一个开发人员实体,它是团队外部自身范围内上下文中的聚合根

现在,团队实体实施独特的开发人员非常简单。另外,我认为团队应该向开发者收费,但开发者仍然不明白收费是什么意思,而不是故事


模型应该严格遵循现实生活中的过程,一旦你开始执行技术规则,X是实体,Y是价值对象,我必须有一个存储库,等等,你走错了路

只有领域专家才能告诉你模型是否损坏,但我可以告诉你一些我突然发现的事情

团队是聚合根,而不是将开发人员分组的聚合。然而,在团队范围内的上下文中,开发人员的定义可能仅仅意味着一个Id和一些相关的行为,也就是说,它不是同一个开发人员实体,它是团队外部自身范围内上下文中的聚合根

现在,团队实体实施独特的开发人员非常简单。另外,我认为团队应该向开发者收费,但开发者仍然不明白收费是什么意思,而不是故事


模型应该严格遵循现实生活中的过程,一旦你开始执行技术规则,X是实体,Y是价值对象,我必须有一个存储库,等等,你走错了路

但是我会将一个实体从团队聚合公开到外部,不是吗?没有域驱动的设计禁止对象持有对另一个聚合内实体的对象引用。这并不意味着你不能存储对对象标识的引用,这就是答案。但是,我会将团队聚合中的实体公开给外部,不是吗?没有域驱动的设计禁止对象持有对另一个聚合中实体的对象引用。这并不意味着您不能存储对对象标识的引用,这就是这个答案的作用。我看到您已将该问题标记为“数据建模”。这是您的思维方式告诉您的一个提示:您正在为数据状态建模,而不是为业务流程行为(即DDD)建模。感谢您的提示!这比乍一看更有价值,因此+1:-我看到您将问题标记为“数据建模”。这是您的思维方式告诉您的一个提示:您正在为数据状态建模,而不是为业务流程行为(即DDD)建模。感谢您的提示!这比乍一看更有价值,因此+1:-+1我认为您在不同的上下文中突出显示了开发人员,这是一针见血的。开发人员很可能在许多团队中工作——在这种情况下,关系是相反的,其中开发人员是聚合根,包含一个或多个团队。OP已经暗示了有界上下文——在故事/工作上下文中,开发人员只是一个名称字符串。我想补充一点,引入一些自然键或代理键通常是一个好主意,这些键在不同的上下文中是一致的,并且可能在跨上下文时充当参考键-正如mattwagl所建议的那样..+1我认为您在不同的上下文中突出显示开发人员是一针见血的。开发人员很可能在许多团队中工作——在这种情况下,关系是相反的,其中开发人员是聚合根,包含一个或多个mor e小组。OP已经暗示了有界上下文——在故事/工作上下文中,开发人员只是一个名称字符串。我想补充一点,引入一些自然键或代理键通常是一个好主意,它们在不同的上下文中是一致的,并且可能在不同的上下文中充当参考键,正如mattwagl所建议的那样。。