我听说过为域模型编写验证的不同方法,所以我想知道在域驱动的设计中,哪种方法更好。
- 有些人说,在初始化域模型之前最好先验证它的数据(这意味着验证应该在相关的DTO上运行(
- 有些人说,最好在初始化域模型后验证它的数据(这意味着验证应该在初始化的实体或域模型上运行(
- 此外,有些人说所有的验证都应该在实体内部运行(确切地说是在setter或构造函数中(
事实上,我习惯于编写上述验证的组合,但现在我不确定。它们中哪一个是常见的,基本上更明智?
在域驱动的设计中,您最有可能看到的是"值对象",它们保证在初始化过程中满足某些约束,因此在值对象本身的构造函数中也是如此。由于值(按照惯例(在其生命周期内是不可变的,因此通常不会在其接口中包含setter。
DTO服务于不同的目的,但在许多方面与价值对象机械相似。因此,除了域模型中的验证之外,您可能还会在DTO中看到验证。
您的实体中通常没有值验证。实体通常包含对值(验证其自身(或其他本地实体(在其他地方验证(的引用,因此检查引用是否正确是有限制的(即,检查null(。