在Application层中验证域对象属性。好吗?

时间:2015-12-18 21:44:07

标签: domain-driven-design

DDD中,Application图层应该只执行协调任务,而Domain图层则负责验证业务规则。

我的问题是验证域对象属性。例如,在通过存储库将数据库持久存储到数据库之前,我需要验证必需属性是否具有某些值。

DDD而言,在Application图层中执行此类属性验证是否可以接受?

2 个答案:

答案 0 :(得分:2)

您可以验证ui图层中的传入数据。 例如,您可以使用symfony表单验证,或者使用Rest检查图层内的必要数据。

域层怎么样,取决于 你没有确切地知道它是什么类型的域对象。

大多数情况下,您通过创建Value Object来进行此类验证,其中包含创建逻辑。例如Email Value Object,你不能创建错误的,否则会抛出异常。

聚合可以在执行方法之前执行验证,它被称为不变量。例如,用户有方法becomeVIP,在有约束的方法内,只有名为'Andrew'的用户才能成为VIP。 因此,您不会在操作后进行验证,而是在操作之前进行验证。你不要让你的聚合进入错误的状态。

如果您有与聚合无关的逻辑,则将其放入域服务中,例如电子邮件唯一性检查。

答案 1 :(得分:1)

我不想在域的外围“验证所需的属性在其中具有某些价值”,而是首先确保域中的can never become null

您可以通过强制该实体的构造函数,工厂和方法的使用者始终为该属性传递值来实现此目的。

话虽如此,您还可以在应用程序级别和表示层中强制执行它(大多数Web应用程序框架提供了方便的方法来检查它们)。比一个更好2或3个验证。但域名应该是一致性的主要来源。