在DDD
中,Application
图层应该只执行协调任务,而Domain
图层则负责验证业务规则。
我的问题是验证域对象属性。例如,在通过存储库将数据库持久存储到数据库之前,我需要验证必需属性是否具有某些值。
就DDD
而言,在Application
图层中执行此类属性验证是否可以接受?
答案 0 :(得分:2)
您可以验证ui图层中的传入数据。 例如,您可以使用symfony表单验证,或者使用Rest检查图层内的必要数据。
域层怎么样,取决于 你没有确切地知道它是什么类型的域对象。
大多数情况下,您通过创建Value Object来进行此类验证,其中包含创建逻辑。例如Email Value Object,你不能创建错误的,否则会抛出异常。
聚合可以在执行方法之前执行验证,它被称为不变量。例如,用户有方法becomeVIP
,在有约束的方法内,只有名为'Andrew'的用户才能成为VIP。
因此,您不会在操作后进行验证,而是在操作之前进行验证。你不要让你的聚合进入错误的状态。
如果您有与聚合无关的逻辑,则将其放入域服务中,例如电子邮件唯一性检查。
答案 1 :(得分:1)
我不想在域的外围“验证所需的属性在其中具有某些价值”,而是首先确保域中的can never become null 。
您可以通过强制该实体的构造函数,工厂和方法的使用者始终为该属性传递值来实现此目的。
话虽如此,您还可以在应用程序级别和表示层中强制执行它(大多数Web应用程序框架提供了方便的方法来检查它们)。比一个更好2或3个验证。但域名应该是一致性的主要来源。