DDD集成:命令处理程序问题?

问题描述 投票:0回答:1

[我使用DDD架构,但是我很难理解一些事情。

这是我的项目的方案:Scheme

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

假设我们要管理工人在公司工作的时间,我们有以下汇总:

TimeTracking(实体根)

  • HourTrackginID
  • CompanyID
  • WorkerID
  • EntryTime
  • 退出时间

Worker(实体)

  • WorkerID
  • CompanyID
  • AllowTimeTracking
  • ListOfWorkerHolidays

公司(实体)

  • CompanyID
  • AllowTimeTracking
  • ListOfCompanyHolidays

假日(值对象)

  • HolidaysID
  • 开始日期
  • 结束日期

并且从WPF应用程序或WebService(使用和应用程序或其他工具),我们使用命令发送companyID和workerID。

我的问题如下:

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

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

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

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

c# command entity domain-driven-design aggregate
1个回答
0
投票

我认为您的设计是颠倒的。我假设一个WorkerID只能与一个公司关联,而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之前从命令中调用它。您可以从工作程序获取CompanyID。如果Holidays不属于该公司,则可以使用CanWorkerLogTime(logDate)

方法来创建HolidayService
© www.soinside.com 2019 - 2024. All rights reserved.