在DDD中将实体的验证放在何处?

时间:2018-09-09 10:18:45

标签: validation domain-driven-design

我想确认/澄清我关于DDD实体验证的假设是否正确。

例如-我有一个域对象WorkReport,该对象包含一个或多个活动WorkReportActivity,有一个addNewActivity用来追加新活动:

public void addNewActivity(final WorkReportActivity activity) {
    activities.put(activity.getId(), activity);
}

问题:

我想知道在{/ {1}}实例有效的地方进行检查/验证,以便报表可以接受它并且不包含无效数据。

不允许允许创建带有无效参数的WorkReportActivity实例并在WorkReportActivity构造函数中进行验证是否足够?有时,对于应用程序中的不同用例,会有更多的观点是什么是有效实例。

2 个答案:

答案 0 :(得分:0)

  

我想知道在哪里可以检查/验证WorkReportActivity实例是否有效,以便报表可以接受它并且不会包含无效数据。

通常:在创建活动的构造函数/工厂方法中。

基本思想是,您只有一个阻塞点,可以将数据组装到特定的type中,然后类型检查器可以强制执行其余代码所需的保证。

如果您的实现语言不包括“强”类型检查,则可能需要一些技巧。 (从Java世界开始,在设计时就可以使用这些检查。)

警告:与实体相关联的验证实际上有两种。确保“状态”有效-与将要进行的假设一致-通常是在代表该状态的值对象中进行的。但是您可能还需要验证是否允许该实体从一种有效状态转换为另一种有效状态。

(此验证通常是隐式的-我们经常让实体从其当前状态计算其下一个状态,并通过该计算确保过渡有效)。

答案 1 :(得分:0)

实际上,您应该在正在创建的实例有效的任何域对象的构造函数中进行验证,无论谁调用构造函数。您必须将所有验证规则集中在一个方法中,然后从构造函数中调用它。