2017-04-23 20 views
0

我试图应用一些DDD概念,我只是想知道什么更有意义:对于实体来调用自己的方法,或为用户(演员)这样做?该实体是否调用其自己的行为或执行该actor?

例如,假设我们有一个约会实体。 只有当他/她是该约会的所有者时,用户才能取消该约会(因此,在我们允许该操作之前,我们需要检查用户是否具有适当的权限)。我们可以做的两种方式这一个:

pseudocode 

// method #1 
User.Cancel(a *Appointment) result 

// method #2 
Appointment.Cancel(u *User) result 

限界上下文是“约会”,但它似乎更有意义,为用户调用上比周围的其他方式的实体的行为。 哪种方式更好,为什么?

回答

1

首先,您需要确定什么是Aggregate rootAR),UserAppointment。为了确定您应该检查必须保护的业务不变量,您应该看到什么是事务边界。有一篇非常好的文章hereAR是用于访问其所有子/嵌套实体的实体。

因此,根据您的设计,将会有AR和一个子实体(您的设计中的另一个实体)或两个ARs

然后,您通过指定其他实体的ID而不是孔对象来访问该聚合的命令方法。

Appointment.Cancel(uId *UserID) 

或者

User.Cancel(aId *AppointmentID) 

现在,权限检查是一般不自然在聚合所属的行为。在调用方法之前完成验证。集合设计不应仅受此许可事件影响。例如,秘书也可以取消预约,不仅是参与者。许可检查在另一个bounded context

以您的域到目前为止我所理解的约会应该是一个AR和你的代码应该是这样的:

Appointment.Cancel(byWhom *UserID) 

最后一件事,如果你按照CQS模式则该方法不返回任何东西。

+0

感谢您的回答。除非你说权限检查不属于一个聚合,否则一切都很清楚。我认为这就是聚合的原因 - 封装领域知识和执行不变量。要使用你的例子,不应该约会'AR'知道秘书域对象可以做什么和不能做什么? – user7467314

+1

授权是一个交叉问题,因此是一个通用的子域。在Eric Evans的DDD书中,在实施DDD书以及所有其他来源中,这是作为另一个BC实施的。你可以在这里阅读更多:http://stackoverflow.com/a/23485141/2575224或只搜索“权限检查ddd”在谷歌 –

相关问题