我试图应用一些DDD概念,我只是想知道什么更有意义:一个实体调用自己的方法,或者让用户(演员)这样做?
例如,我们假设我们有一个约会实体。 用户只有在他/她是该约会的所有者时才能取消约会(因此我们需要在允许该操作之前检查用户是否具有适当的权限)。我们可以通过以下两种方式之一做到这一点:
column B
有界上下文是" Appointments",但似乎对于用户调用实体上的行为比反过来更有意义。 哪种方式更好,为什么?
答案 0 :(得分:1)
首先,您需要确定Aggregate root
(AR
),User
或Appointment
是什么。为了确定您应该检查必须保护的业务不变量,您应该看到什么是事务边界。有一篇非常好的文章here。 AR
是用于访问其所有子/嵌套实体的实体。
因此,根据您的设计,会有AR
和子实体(设计中的其他实体)或两个ARs
。
然后,通过仅指定其他实体的ID而不是孔对象来访问聚合上的该命令方法。
Appointment.Cancel(uId *UserID)
或者
User.Cancel(aId *AppointmentID)
现在,权限检查通常是一种自然不属于聚合的行为。该验证在调用方法之前完成。聚合设计不应仅受此许可事项的影响。例如,秘书也可以取消预约,而不仅仅是参与者。权限检查在另一个bounded context
。
根据我对您所在域名的理解,约会应为AR
,您的代码应如下所示:
Appointment.Cancel(byWhom *UserID)
最后一件事,如果你遵循CQS模式,那么该方法不会返回任何内容。