我正在尝试使用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
聚合根访问)?
有关此的任何提示吗?
我的模特完全坏了,还是我错过了一些重要的东西?
答案 0 :(得分:2)
您可以使用ID作为参考。
var jane = developer.findByName('Jane Doe');
story.ChargeWork(jane.id, new TimeSpan(2,0,0));
答案 1 :(得分:1)
除了领域专家之外,没有人可以告诉你模型是否坏了,但我可以告诉你一些IMO弹出的东西。
团队是一个聚合根(不是聚合),它将开发人员组合在一起。但是,团队有限上下文中Developer的定义可能仅仅意味着Id和一些相关行为,也就是说它不是同一个Developer实体,它在自己的有限上下文中是一个聚合根(在团队之外)。
现在,Team实体强制执行独特的开发人员非常简单。此外,我认为团队应该向开发人员收费(仍然混淆了收费的含义)而不是故事。
模型应该紧跟现实生活过程,一旦你开始执行技术规则(X是实体,Y是价值对象,我必须有一个存储库等),你就走错了路。