gpt4 book ai didi

.net - 如何在数据绑定(bind)场景(即 BindingList)中验证自定义对象的属性?

转载 作者:行者123 更新时间:2023-12-03 03:25:07 24 4
gpt4 key购买 nike

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

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

如果之后验证,则需要撤消(即通过IEditableObject),以便用户可以随时取消编辑。我们还可以选择在此处抛出异常或通过 IDataErrorInfo 公开错误。

我认为如果在设置之前进行验证,IDataErrorInfo 没有意义。有些人还可能认为在验证场景中抛出异常是不合理的。

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

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

我对实现 IEditableObjectIDataErrorInfo 的域对象也不满意,INotifyPropertyChanged 等。它使域对象因额外的问题而变得困惑。但如果你想很好地进行数据绑定(bind),这似乎是不可避免的。我可以创建一个包装器,也许是 DTO,但我不太热衷于必须编写大部分虚拟的额外代码来支持这些数据绑定(bind)位。

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

最佳答案

参见my answerBusiness Objects, Validation And Exceptions :我认为Paul Stovell关于验证的想法(总结 in this article )非常强大。

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

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

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

关于.net - 如何在数据绑定(bind)场景(即 BindingList)中验证自定义对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/179485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com