- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从以数据为中心的设计和开发转变为 DDD,并且已经阅读了 Evans 和 Nillson,但仍然无法解决我应该如何构建域层的问题。我确定我当前项目的性质没有帮助!
一点背景
该应用程序是管理人员评估的内部解决方案。 HR 人员将创建评估"template",其中包含一组问题,团队领导和经理要为他们的每个直接下属完成这些问题。答案将保留以供审核和审查。这些评估可以用于各种各样的事情,例如对公司计划的反馈、绩效评估等。
我以数据为中心的一面
不是为了影响解决方案而是突出我以数据为中心的心态,我已经对数据库模式有了一个愿景,并将其包含在此处仅供引用(因为图片表示一千个字):
正如预期的那样,模式已标准化,并且与我的应用程序中处理数据的方式不匹配。而且,我忽略了查找表等,以尽量减少手头的问题。
用例
第一个用例是检索并显示用户需要完成的评估列表。这将在用户首次登录应用程序时显示,起初看起来相对容易,但有两个问题: 1 - 评估是基于时间的,因此可能需要每月、每年或每“x”一次基于员工周年日期的年数;并且, 2 - 用户可以保存正在进行的评估并稍后完成。因此,该列表应包含到期的评估以及任何正在进行的评估。
接下来,当用户选择要执行的评估时,我需要检索该评估(当前版本)的所有问题,以便将它们显示给用户。在评估过程中的任何时候,用户都可以保存当前的结果。只有在整个评估完成后,它才能真正“提交”——或提交。
第三,HR 需要一种方法来根据主管提供的回复重新生成评估。
最后,HR 能够创建和修改评估——并且它们是版本化的。因此,每当有人修改评估时,就会创建一个新版本,并且该版本成为执行的任何新评估的模板(任何正在进行的评估继续使用其原始模板)。
领域模型
不按顺序工作,对我来说,我将有一个评估实体作为聚合根来满足第四个用例是有意义的。它将有一个 Section 实体的子集合,而 Section 实体又将有一个 Question 实体的子集合。他们都是实体,因为他们有身份(是的?)。评估是消费代码用于持久性、验证等的对象(尽管 Section 和 Question 实体验证自己并将状态汇总到根评估)。我的目标是从消费者那里抽象出版本控制并在数据持久层中实现它(好还是坏主意?)
这意味着我还将拥有一个为我处理持久性的 AssessmentRepository,可能还有一个在需要时创建新评估的 AssessmentFactory。
更大的问题来自其他用例。我是否也有 EmployeeAssessment 聚合根?或者它只是一个实体?
查看用例,我需要通过多种方式使用此信息。首先,当我生成要显示给用户的评估列表时,我不仅要根据评估频率评估直接报告列表,还需要知道我是否已经开始和/或完成了评估对于那个员工。这来自 EmployeeAssessments 表。另一种情况是当用户实际执行评估时,我正在与 EmployeeAssessments 和 Responses 表进行交互。
从 UI 的角度来看,当用户执行评估时,他们对内部数据结构等一无所知。我需要向 UI 提供该评估的问题列表,以显示并接受响应列表以保持不变。这是否会导致带有随附存储库等的第二个根?
第三个用例的相似之处在于 HR 希望能够在以后重新生成带有响应的评估。但是,我认为这里可以使用执行评估时使用的相同过程,因为恢复现有评估将需要相同的数据,唯一的区别是读/写能力与只读的 HR。
早点收起来吧!
好吧,我已经说得够多了,我想我已经清除了我的脑袋。我感谢任何方向、建议、批评等。正如我所说,我正在尝试进行跳跃并认为我理解这些概念,现在是应用它们的问题。谢谢!!!
最佳答案
几年前我和你一样跳了起来。我现在正在从普通的 DDD 跳转到 CQRS(请参阅 cqrsinfo.com/)。
我会以 CQRS 的方式来处理这个问题,即使用事件存储并在架构级别上将读取与写入完全分开。但是,我认为您提到的问题更符合普通的 DDD 方式 - 所以我将在这种情况下回答。
您需要完全摆脱“数据驱动”的想法。从主要工作流程开始。第一次和第三次使用本质上只是获取操作。我将首先关注聚合根状态发生变化的用例。所以用例 2,即“执行评估”将是一个很好的起点。
关于domain-driven-design - 真实世界的 DDD : Structuring the Domain Layer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5572607/
我遇到了搜索引擎优化问题,用户可以通过指定任何子域访问我的站点。这会导致 SEO 出现重复页面问题。 例如,如果用户错误输入“www”然后在论坛上发布了一个链接,则谷歌正在抓取“wwww.domain
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicates: Can I change all my links to just //? Network-Path Ref
我正在玩 lighttpd在小型虚拟专用服务器上。我两个域指向服务器。我在 Ubuntu 8.10 上使用最新版本的 lighttpd 和 mod_evhost。 我正在尝试设置一个规则,这样如果任何
我正在开发一个由 domain.ext 提供的网络应用程序。此 Web 应用程序使用基于 cookie 的 session ,并为用户提供在子域上托管包含自定义 JavaScript 的网页的能力,例
我想重定向: 情况一、example.com到subdomain.example.com 情况2.www.example.com到subdomain.example.com 我已将这两段代码放入我的
我遇到了“领域对象”这个术语,并在 Google 上找到了几个定义,但我只是想验证我的理解是否正确。 这是否只是表示业务规则的任何类 - 因为“域”一词通常表示特定于某些本地问题集的规则,例如如何计算
将我们的应用程序静态内容托管在一个完全不同的域上而不是像其他域一样托管在我们主域的子域上有什么好处吗?例如微软使用 i.microsoft.com,谷歌使用 gstatic.com,雅虎使用 yimg
Orbited的客户端JS组件( cometd 服务器),要求如果服务器运行在与 JS 本身不同的域或端口上,则必须执行 document.domain = document.domain; 在加载任
我通读了另一篇文章,但似乎没有人回答我一直遇到的问题。是否可以使用通配符域的通配符子域(即使它仅用于子域而不是子子域),例如:foo.example.local。 我已经有 example.local
我在 Google Domains 上有一个域名,我想指向我在家里的 raspberry pi 服务器上运行的网站。我的公共(public) IP 地址是动态的,当 IP 更新时,我无法弄清楚如何保持
我有这个经典的 DDD 问题;我有一个做一些事情的域服务“DetectPriority”。 PM 要求我创建 2 个不同的服务;一个 INTERNAL(包含完整的业务规则并涉及许多其他领域模型)和另一
An interesting thread我刚才输入这个问题时就出现了。但我认为它没有回答我的问题。 我一直在使用 .NET MVC3 进行大量工作,因此需要一个贫乏的模型。 View 模型和编辑模型
我正在通过docker-compose运行最新版本的Artifactory OSS(如here和here所述)。我的docker-compose文件看起来像这样: version: '2' servi
我正在阅读 MDC entry for nsICookieManager2.add它讨论了域和非域 cookie。这两种类型的 cookie 有什么区别? 最佳答案 来自 RFC2109: Host
这是我的问题:http://regexr.com?2temn 我相信对于你们中的一些正则表达式大师来说这很简单。 干杯! 最佳答案 这也有效: (?<=\.|)\w+\.\w+$ 仅使用 PHP 进行
这应该很简单,但我无法理解。有许多好的和坏的正则表达式方法来匹配 URL,有或没有协议(protocol),有或没有 www。我遇到的问题是这个(在 javascript 中):如果我使用正则表达式来
我有一个网站 http://mywebsite.tld ,我想将 www.mywebsite.tld 重定向到 http://mywesite.tld (所以 www=>非 www) (防止重复内容)
TL;DR 我应该从 www.domain.tld 重定向到 domain.tld 还是相反? 我正在运行一个处理多个域的 CMS。到目前为止,CMS 负责将 www.domain.tld 重定向到
我目前有以下代码: string user = @"DOMAIN\USER"; string[] parts = user.Split(new string[] { "\\" }, StringSpl
使用 Go 和 AWS-SDK 我正在尝试查询 AWS 控制台中 Route53 -> Hosted Zones 下列出的 route53 CNAME 和 A 记录。我可以使用以下代码进行查询,但它需
我是一名优秀的程序员,十分优秀!