【问题标题】:DDD integration: command handler questions?DDD 集成:命令处理程序问题?
【发布时间】:2020-01-16 16:30:32
【问题描述】:

我使用 DDD 架构,但我很难理解一些东西。

这是我项目的方案: Scheme

首先,在提问之前,我先举个例子,然后再提问。

假设我们要管理员工为公司工作的时间,我们有以下聚合:

时间跟踪(实体根)

  • HourTrackginID
  • 公司ID
  • 工人ID
  • 进入时间
  • 退出时间

工人(实体)

  • 工人ID
  • 公司ID
  • 允许时间跟踪
  • ListOfWorkerHolidays

公司(实体)

  • 公司ID
  • 允许时间跟踪
  • ListOfCompanyHolidays

假期(值对象)

  • 假期ID
  • 开始日期
  • 结束日期

从我们的 WPF 应用程序或 WebService(使用和应用程序或其他)我们使用命令发送 companyID 和 workerID。

我的问题如下:

  1. 我收到一个只有 workerID 和 companyID 的命令,但我显然需要检索这些实体的信息和 TimeTrackerID(如果 worker 没有和 ExitTime)。这应该在哪里完成?在通过存储库的命令处理程序中?还是命令应该已经包含所有信息?

  2. 假设我们有命令处理程序中第一个点的信息,现在我们应该使用我们拥有的信息创建一个 TimeTracking 聚合根。然后根据数据,我们将调用 TimeTracking 实体的 DoExit()/DoEntry() 函数。谁应该负责添加/更新 TimeTracking?函数是否应该验证业务规则,例如不在假期、允许跟踪等,并返回 true 或 false,然后 Command Handler 执行添加/更新?或者函数应该创建一个执行进入/退出的域事件来委派添加/更新?

  3. 另一方面,如果命令处理程序中可能出现错误,我应该如何更新 UI?例如公司不存在,这应该以某种方式通知,所以在命令处理程序中返回一个成功/错误和错误类型的对象是一个正确的解决方案? 同样在验证业务规则时,我是否也应该返回一个对象来传达错误? 因此,如果我们执行以下操作:当调用 DoEntry() 时,公司不允许跟踪我向命令处理程序返回一个对象错误,该处理程序也会返回此错误,是否正确?

  4. 最后,对于每一个操作和实体的操作(编辑工作者、删除时间跟踪...)我们都需要一个命令吗?

【问题讨论】:

    标签: c# command entity domain-driven-design aggregate


    【解决方案1】:

    我认为你的设计是颠倒的。我假设 WorkerID 只能与单个 Company 关联,而 HourTrackingID 只能与单个 Worker 关联。通常,您的聚合根是“一对多”关系的“一”部分,这意味着 Worker 是 AR,而 TimeTracking 是聚合。

    您的命令将是 ClockInWorker 并传递 WorkerID。 CompanyID 是不必要的,因为此命令不关心工人为谁工作,只关心他们是否打卡。此命令将调用方法 Worker.DoEntry,该方法将创建一个带有进入时间的 TimeTracking 记录。然后你有另一个命令 ClockOutWorker,它以相同的方式工作,但调用 Worker.DoExit。

    数据验证(检查 workerID 是否有效)在 API 和命令中都发生。假设 WorkerID 是一个 guid,API 会验证它是否收到了一个实际的 guid。 API 不会验证 guid 是否对应于真正的工作人员——这取决于命令。 API 确保请求在语法上有效,Command 确保遵循业务规则。

    您不会显示假期是否属于公司。如果是这样,那么公司应该通过 Company.CanWorkerLogTime(workerID, logDate) 方法验证假期。这应该在调用 Worker.DoEntry 之前从命令中调用。您可以从 Worker 获取 CompanyID。如果假期不属于公司,那么您将使用 CanWorkerLogTime(logDate) 方法制作 HolidayService

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多