【发布时间】:2011-04-06 20:35:51
【问题描述】:
我正在尝试从以数据为中心的设计和开发过渡到 DDD,并且已经阅读了 Evans 和 Nillson,但我仍然无法弄清楚我应该如何构建我的领域层。我确信我当前项目的性质没有帮助!
一点背景
该应用程序是管理人员评估的内部解决方案。人力资源人员将创建评估“模板”,其中包含一组问题,团队领导和经理要为他们的每个直接下属完成这些问题。答案将被保留以供审核和审查。这些评估可以针对各种各样的事情,例如对公司计划的反馈、绩效评估等。
我以数据为中心的一面
不影响解决方案,但突出我以数据为中心的思维方式,我已经对数据库架构有了一个愿景,将其包含在此处仅供参考(因为一张图片说明了一千个单词):
正如预期的那样,该架构已标准化,并且与我的应用程序中的数据处理方式不匹配。而且,我省略了查找表等,以尽量减少手头的问题。
用例
第一个用例是检索并显示用户需要完成的评估列表。这将在用户首次登录应用程序时显示,起初看起来相对容易,但有两个问题: 1 - 评估是基于时间的,因此可能需要每月、每年或每个“x”基于员工周年日的年数;并且,2 - 用户可以保存正在进行的评估并在以后完成。因此,该列表应包含到期的评估以及正在进行的评估。
接下来,当用户选择要执行的评估时,我需要检索该评估(当前版本)的所有问题,以便将它们显示给用户。在评估期间的任何时候,用户都可以保存当前结果。只有在完成整个评估之后,才能真正“提交”或提交。
第三,HR 需要一种方法来根据主管提供的回复重新生成评估。
最后,HR 能够创建和修改评估 - 并且它们是版本化的。因此,每当有人修改评估时,都会创建一个新版本,并且该版本将成为执行的任何新评估的模板(任何正在进行的评估继续使用其原始模板)。
领域模型
如果工作不正常,我将有一个作为聚合根的评估实体来满足第四个用例,这对我来说是有意义的。它将具有 Section 实体的子集合,而 Section 实体又将具有 Question 实体的子集合。它们都是实体,因为它们具有身份(是吗?)。评估是消费代码用于持久性、验证等的对象(尽管部分和问题实体验证自己并将状态汇总到根评估)。我的目标是从消费者那里抽象出版本控制并在数据持久层中实现它(好主意还是坏主意?)
这意味着我还将拥有一个为我处理持久性的 AssessmentRepository,并且可能还有一个在需要时创建新评估的 AssessmentFactory。
更大的问题来自其他用例。我也有 EmployeeAssessment 聚合根吗?还是只是一个实体?
查看用例,我需要通过几种方式使用这些信息。首先,当我生成要显示给用户的评估列表时,我不仅要根据评估频率评估直接报告列表,而且我还需要知道我是否已经开始和/或完成了评估对于那个员工。这来自 EmployeeAssessments 表。另一种情况是当用户实际执行评估时,我正在与 EmployeeAssessments 和 Responses 表进行交互。
从 UI 的角度来看,当用户执行评估时,他们对内部数据结构等一无所知。我需要向 UI 提供该评估的问题列表,以显示并接受响应列表坚持。这是否会导致带有随附存储库等的第二个根目录?
第三个用例类似,HR 希望能够在以后重新生成带有响应的评估。但是,我认为可以在此处使用执行评估时使用的相同流程,因为恢复现有评估需要相同的数据,唯一的区别是读/写能力与 HR 的只读能力。
已经结束了!
好的,我已经啰嗦了很多,我想我已经清除了玉米棒网的问题。我感谢任何方向、建议、批评等。正如我所说,我正在尝试跳跃并认为我理解这些概念,现在是应用它们的问题。谢谢!!!
【问题讨论】: