1

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

基本上,我假设以下内容:

  • Team是一个实体(因为它可以改变,例如通过让新开发人员加入)
  • Developer也是一个实体(因为哪个开发人员做了什么很重要)
  • Story是一个实体(因为它可以改变,例如通过将工作项预订到故事中)
  • Work是一个值对象(因为它一旦完成就不能改变)

很明显的是Team是一个包含Developer实体的聚合。此外,Story是一个聚合,包含Work值对象。

所以,一开始我从以下代码开始:

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));

如果有两个同名的开发人员,这将失败。如何分配特定的开发人员实体,而无需访问它(因为只能使用Team聚合根访问开发人员)?

对此有任何提示吗?

我的模型完全坏了,还是我错过了一些重要的东西?

4

2 回答 2

3

您可以使用 ID 作为参考。

var jane = developer.findByName('Jane Doe');
story.ChargeWork(jane.id, new TimeSpan(2,0,0));
于 2013-05-02T08:41:12.950 回答
1

除了领域专家之外,没有人可以告诉您模型是否损坏,但我可以告诉您一些 IMO 弹出的内​​容。

团队是一个聚合根(不是聚合),它将开发人员组合在一起。但是,Team 有界上下文中 Developer 的定义可能仅意味着一个 Id 和一些相关行为,也就是说,它不是同一个 Developer 实体,它是其自己的有界上下文(团队外部)中的 Aggregate Root。

现在,Team 实体可以很简单地强制执行唯一的开发人员。另外,我认为团队应该向开发人员收费(仍然混淆收费的含义)而不是故事。

该模型应该密切关注现实生活中的过程,一旦你开始执行技术规则(X 是实体,Y 是值对象,我必须有一个存储库等),你就走错了路。

于 2013-05-02T08:46:10.580 回答