不变量和验证规则有什么区别?

What is the difference between Invariants and Validation Rules?

我经常在 DDD 中看到术语 不变量Here Dino Esposito talks about it. If I look at the .NET library, I see a ValidationAttribute class。 不变量验证规则是否相同?例如,我是否可以说 50% 的折扣仅在订单总额超过 $250 时可用 是不变的?

或者它们的不同之处在于不变量是为了防止对象变得无效,而验证是为了检查对象的有效性,即使它已经改变了它的状态(它可以处于有效或无效状态)?在上面的示例中,如果我使用不变量,我会在更新折扣之前检查不变量,在验证的情况下,我应用 50% 的折扣然后检查有效性(对象已经处于无效状态)。 =11=]

毫无疑问,验证是批准给定对象状态的过程,而不变性强制执行发生在该状态之前。

一个推论是,不变的执行最好由正在变异(或创建)的事物本身执行,例如自我保护反射,而验证通常由第三方完成。

Always valid 学派提倡使用不变量而不是验证。我认为它与 DDD 和聚合完美结合。

是的,我也这么认为

In DDD, validation rules can be thought as invariants. The main responsibility of an aggregate is to enforce invariants across state changes for all the entities within that aggregate.

您可以在此参考更多信息 page