【发布时间】:2017-06-28 21:38:07
【问题描述】:
我正在开发一个具有员工时间跟踪模块的应用程序。当员工开始工作时(例如在某个抽象机器上),我们需要保存有关他工作的信息。每天都有很多员工在很多机器上工作,他们在它们之间切换。当他们开始工作时,他们会通知系统他们已经开始工作。当他们完成工作时 - 他们也会通知系统。
我有一个聚合 Machine 和一个聚合 Employee。这两个是具有自己行为的聚合根。现在我需要一种方法来为任何给定的Employee 或任何给定的Machine 在任何给定的时间段内构建报告。例如,我想查看哪些 machines 确实让 employee 使用了一段时间以及使用了多长时间。或者我想看看哪些员工在这个给定的机器工作了多长时间。
理想情况下(我认为)我的聚合 Machine 应该有方法 startWorking(Employee employee) 和 finishWorking(Employee employee)。
我创建了另一个聚合:EmployeeWorkTime,它存储有关 Machine、Employee 和 start,finish 时间戳的信息。现在我需要一种方法来修改一个聚合并同时创建另一个(或者最好是另一种方法,因为这种方式有点困难)。
此外,员工有一个Shift,描述了他们每天必须工作多少小时。来自Shift 的信息应保存在EmployeeWorkTime 聚合中,以便在Shift 已更改为给定Employee 的情况下保持一致。
改写的问题
我有一个Machine,我有一个Employee。我怎么能保存信息:
这个 Employee 从 1.05.2017 15:00 到 1.05.1017 18:31 在这个 Machine 工作。
我可以简单地使用 CRUD 来做到这一点,在一个事务中保存多个聚合,数据库优先。但我想使用 DDD 方法来管理复杂性,因为整个领域非常复杂。
【问题讨论】:
-
如果事件溯源在那里适用,我如何有效地存储域事件以更快地构建报告?每个重要的领域事件都应该是它自己的聚合吗?我也不需要从事件中恢复聚合,因为这些事件对于聚合构造毫无用处。
-
聚合必须保护哪些不变量?
-
多名员工不能同时使用同一台机器。同一员工不能同时使用多台机器。在另一台机器上开始另一台机器之前,员工必须通知他在给定机器上完成了他的工作。
-
@EwanCoder 我认为这些不变量是肤浅的。您可能会遇到类似“员工 A 开始在机器上工作并去吃午饭但没有表明他已经完成。员工 B 无法使用机器,因为它被员工 A 锁定”这样的情况。我只允许他们记录他们想要的任何内容,然后让他们修复不一致的时间表。您还可以更聪明一点,以便特定员工在开始使用新机器之前必须解决自我矛盾。
-
例如,员工 B 无论如何都可以使用这台机器,但是当 A 回来尝试使用另一台机器时,系统会询问他何时完成前一台机器的工作。输入的时间(手动)必须在员工 B 开始在机器上工作之前。您可以做的其他事情是在几秒/分钟未使用的机器上设置自动完成计时器。