使用新的 ASP.NET MVC 2 验证功能,我们可以使用DataAnnotations
描述有效值标准的属性来装饰域模型对象的属性。DefaultModelBinder
知道这一点并在ModelState.IsValid
调用控制器操作之前相应地填充。由于验证规则是在域模型中定义的,因此这被视为模型级别的验证。斯科特·格思里写道:
在我们的 Person 对象中实现规则的好处是,这将确保验证将通过我们应用程序中使用 Person 对象的任何场景 [...]
严格来说,我认为这些规则并没有真正执行,因为所有操作方法都需要检查ModelState.IsValid
属性并根据其值采取不同的行动。此外,虽然规则是在模型中定义的,但它们在表示层中应用,因为这是所有模型绑定器所在的地方。但我想这只是我对单词的选择很挑剔(或者我完全错了)。
但是,如何在域模型级别执行验证规则呢?Steven Sanderson 在一篇关于 xVal 验证框架的文章中使用了这种方法,他写道:
现在,模型层通过拒绝放置不符合所有验证和业务规则的预订来强制执行其自身的有效性。
在他的示例中,“预订管理器”(位于模型中)在使用代码尝试进行无效预订时抛出一个特殊的业务规则异常。因此,消费代码不可能进行无效预订,无论它是否事先检查了预订的有效性(通过ModelState.IsValid
或其他一些自定义构造)。
所以我的问题是:
假设在模型级别定义了验证规则,它们是否也应该在模型中强制执行?
(请注意,我对领域驱动设计的概念真的很陌生,所以如果我没有使用正确的术语,请多多包涵。)