【发布时间】:2020-01-16 16:30:32
【问题描述】:
我使用 DDD 架构,但我很难理解一些东西。
这是我项目的方案: Scheme
首先,在提问之前,我先举个例子,然后再提问。
假设我们要管理员工为公司工作的时间,我们有以下聚合:
时间跟踪(实体根)
- HourTrackginID
- 公司ID
- 工人ID
- 进入时间
- 退出时间
工人(实体)
- 工人ID
- 公司ID
- 允许时间跟踪
- ListOfWorkerHolidays
公司(实体)
- 公司ID
- 允许时间跟踪
- ListOfCompanyHolidays
假期(值对象)
- 假期ID
- 开始日期
- 结束日期
从我们的 WPF 应用程序或 WebService(使用和应用程序或其他)我们使用命令发送 companyID 和 workerID。
我的问题如下:
我收到一个只有 workerID 和 companyID 的命令,但我显然需要检索这些实体的信息和 TimeTrackerID(如果 worker 没有和 ExitTime)。这应该在哪里完成?在通过存储库的命令处理程序中?还是命令应该已经包含所有信息?
假设我们有命令处理程序中第一个点的信息,现在我们应该使用我们拥有的信息创建一个 TimeTracking 聚合根。然后根据数据,我们将调用 TimeTracking 实体的 DoExit()/DoEntry() 函数。谁应该负责添加/更新 TimeTracking?函数是否应该验证业务规则,例如不在假期、允许跟踪等,并返回 true 或 false,然后 Command Handler 执行添加/更新?或者函数应该创建一个执行进入/退出的域事件来委派添加/更新?
另一方面,如果命令处理程序中可能出现错误,我应该如何更新 UI?例如公司不存在,这应该以某种方式通知,所以在命令处理程序中返回一个成功/错误和错误类型的对象是一个正确的解决方案? 同样在验证业务规则时,我是否也应该返回一个对象来传达错误? 因此,如果我们执行以下操作:当调用 DoEntry() 时,公司不允许跟踪我向命令处理程序返回一个对象错误,该处理程序也会返回此错误,是否正确?
最后,对于每一个操作和实体的操作(编辑工作者、删除时间跟踪...)我们都需要一个命令吗?
【问题讨论】:
标签: c# command entity domain-driven-design aggregate