域/对象模型设计问题

时间:2011-08-19 12:44:03

标签: .net domain-driven-design domain-model object-model

我有一个可以分配一个提名者的故事。可以将提名者分配给多个故事。提名者可以将故事移至他们的选票(不是故事只能属于他们的提名者选票)。我过去总是做数据驱动的应用程序,所以不幸的是我已经在考虑如何处理选票了。由于Story表有一个分配给它的指定者id,因此在表中添加一个IsBallot标志是有意义的。但是现在在我的实际领域设计中,故事有一种行为可以将自己添加到选票中(这看起来很奇怪,因为有关于此的提名者有规则)。我想它可以询问提名人是否可以加入选票。我的第二个选择是让另一个表StoryBallot包含提名者ID和故事ID。这里有什么奇怪的故事已经包含了提名者ID,而这张新表也有它。

任何想法或建议都会很棒!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您的域名可以像这样建模:

- A Nominator has stories
- A Nominator can nominate Stories for a Ballot

- A Ballot knows all its Stories and their respective Nominator

- A Story knows its Nominator

使用域驱动设计我们根本不会想到表格。我们会想到聚合,甚至可能是有界背景。但是为了不使事情过于复杂,我将把它保持在Aggregate-Level:

我们可以有两个聚合根:

1. Nominator (who knows all their stories)
2. Ballot (which knows all their nominated stories as 
   well as the respective nominators)

故事本身可能根本无法直接访问,只能分别通过Nominator或Ballot。

如果一个故事没有被提名者拥有或被提名投票,是否有理由存在?如果没有,请使其自身无法访问,并且仅暴露,例如Nominator.GetStories()Nominator.GetNominatedStoriesFor(ballot)和/或Ballot.GetStories()

要将选票添加到选票中,我要么展示Nominator.NominateStory(storyId, ballotId)Ballot.Add(storyId)

当涉及到存储在数据库中时,我可能会有一个表NominatedStories ballotIdstoryId以及一个表Stories,其中包含故事详情和{{ 1}}