设置属性值时,可以在更新内部值之前或之后进行验证。
如果之前验证,如果新值无效,则可以抛出异常。然后该对象始终处于有效状态。
如果验证之后,需要撤消(即通过 IEditableObject ),因此用户可以随时取消编辑。我们还可以选择在此处抛出异常或通过 IDataErrorInfo 公开错误。
如果在集合之前验证,我认为 IDataErrorInfo 是有意义的。 有些人也可能认为抛出异常在验证方案中是不合理的。
在BindingList中包含自定义对象并将数据源设置为网格的情况下,验证之后的效果很好。
在使用网格工作之前进行验证,但是你必须抛出一个异常,以便向数据网格发信号通知属性值的设置(没有很多额外的代码)
我也不熟悉我的域对象实现 IEditableObject 和 IDataErrorInfo , INotifyPropertyChanged 等等。它使域对象更加混乱。但是如果你想用数据绑定来放置它似乎是不可避免的。我可以创建一个包装器,也许是DTO,但是我不是太疯狂,只是为了支持这些数据绑定位而必须编写大量虚拟额外代码。
如何验证对象(最好是在数据绑定和UI环境中)?
答案 0 :(得分:1)
请参阅my answer至Business Objects, Validation And Exceptions:我认为Paul Stovell关于验证的想法(总结为in this article)非常强大。
通过在您的域实体中实现IDataErrorInfo
(可能还有IEditableObject
和INotifyPropertyChanged
),您可以让他们在许多.NET演示技术上获得数据绑定(Windows窗体,WPF, ASP .NET ...)没有太多代码。或者您可以在脚本或批处理中使用它们(即非UI进程),并且仍然可以根据业务规则验证它们:顺利地(查询当前实体状态)或硬路径(如果无效则抛出异常保存)。
主要的是,使用这种模式,您的域实体负责自己的验证(这很好,当然在我看来不像额外的关注)。如果它们处于无效状态,它们会通过在保存时抛出有意义的异常来强制执行它。并且他们可以很好地使用您的代码(UI或不是UI),如果您想先询问,可以告诉您它们是否有效。
我甚至在我的软件工厂项目(仍处于早期阶段)中将这些原则应用于领域模型之外:Salamanca。