3

当您设置一个属性的值时,您可以在更新内部值之前或之后进行验证。

如果之前进行验证,如果新值无效,您可能会引发异常。然后该对象始终处于有效状态。

如果之后进行验证,则需要撤消(即通过IEditableObject),因此用户可以随时取消编辑。我们还可以选择在这里抛出异常或通过IDataErrorInfo暴露错误。

如果在设置之前进行验证,我认为IDataErrorInfo没有意义。有些人可能会争辩说在验证场景中不保证抛出异常。

在自定义对象包含在 BindingList 中并设置为网格的数据源的情况下,验证后的效果很好。

在网格之前验证也可以,但是您必须抛出异常才能向数据网格发出属性值设置失败的信号(无需大量额外代码)

我对实现IEditableObjectIDataErrorInfoINotifyPropertyChanged等的域对象也不满意。它使域对象充满了额外的担忧。但是,如果您想很好地使用数据绑定,这似乎是不可避免的。我可以创建一个包装器,也许是 DTO,但我并不太热衷于编写大部分虚拟的额外代码来支持这些数据绑定位。

您如何验证对象(最好在数据绑定和 UI 的上下文中)?

4

1 回答 1

1

请参阅Business Objects, Validation And Exceptions的回答:我认为Paul Stovell关于验证的想法(总结在本文中)非常强大。

通过IDataErrorInfo在您的域实体中实现(可能还有IEditableObjectINotifyPropertyChanged),您使他们能够在许多 .NET 表示技术(Windows 窗体、WPF、ASP .NET...)上获得数据绑定,而无需太多代码。或者您可以在脚本或批处理中使用它们(即非 UI 流程),并且仍然有可能根据业务规则验证它们:平滑(查询当前实体状态)或硬方式(如果无效则抛出异常保存)。

主要的是,使用这种模式,您的域实体负责自己的验证(这很好,而且在我看来肯定不像额外的问题)。如果它们处于无效状态,它们会通过在保存时抛出有意义的异常来强制执行它。如果您愿意先询问,它们可以通过让您知道它们是否有效来与您的代码(UI 或非 UI)很好​​地配合使用。

我什至在我的软件工厂项目(仍处于早期阶段)中将这些原则应用于域模型之外:Salamanca

于 2009-08-06T13:14:48.397 回答