Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IDataErrorInfo和对象的属性验证_C#_Design Patterns_.net 3.5 - Fatal编程技术网

C# IDataErrorInfo和对象的属性验证

C# IDataErrorInfo和对象的属性验证,c#,design-patterns,.net-3.5,C#,Design Patterns,.net 3.5,由于我试图学习WPF,我越来越多地看到使用接口IDataErrorInfo将错误绑定到接口。我的问题是,我通常将数据验证放在属性的setter中,而不是像IDataErrorInfo这样的方法中。。。这是我发现的一个让我困惑的问题 在.NET3.5中,验证数据对象的好方法是什么?我是否需要在Setter和IDataErrorInfo调用的方法中实现验证?或者只是IDataErrorInfo?还是在二传中呼叫IDataErrorInfo 示例:我有一个firstname字符串,它只能有3到50个字

由于我试图学习WPF,我越来越多地看到使用接口IDataErrorInfo将错误绑定到接口。我的问题是,我通常将数据验证放在属性的setter中,而不是像IDataErrorInfo这样的方法中。。。这是我发现的一个让我困惑的问题

在.NET3.5中,验证数据对象的好方法是什么?我是否需要在Setter和IDataErrorInfo调用的方法中实现验证?或者只是IDataErrorInfo?还是在二传中呼叫IDataErrorInfo


示例:我有一个firstname字符串,它只能有3到50个字符。我是将字符串验证放在setter中(我通常会这样做),还是现在我可以简单地使用IDataErrorINfo。如果数据长度不合适,请检查属性名称并返回字符串错误?我发现在setter中抛出错误而不使用接口更直观,但我看到的大多数示例都使用IDataErrorInfo接口。

如果在setter中抛出异常,那么
IDataErrorInfo
是多余的,因为它(理论上)不能进入非法状态
IDataErrorInfo
允许您接受所有输入,但告诉用户存在问题。这样做的好处是,它可以减少对UI的中断(因为用户可以继续输入数据,即使有一个字段出错并被标记为错误),并且可以很容易地一次报告多个错误(可视化,而不是通过消息框等)

但是,如果您使用此方法,则需要确保在将对象保存到数据库之前验证该对象是否正常,等等


您可以通过从业务逻辑中检查
.Error
(并检查它是否为
null
/empty),假设您编写
.Error
来报告所有错误。或者类似的
Validate()
方法。

我相信IDataError允许更丰富的用户体验。正如Marc所说,它允许更少的中断,尤其是在编辑网格(例如客户对象列表)时

我建议您从下载由Rocky Lhotka开发的CSLA.net框架(他是专家C#2008 Business Objects的作者)。该框架支持验证规则,每个业务对象都实现IDataError。每次更改属性时,都会验证该属性的规则。如果属性值无效,则对象状态将变为无效,从而导致在调用Save()方法时引发异常


他的框架还支持n级撤销。开始编辑业务对象时,将获取该对象的快照(包括已破坏的规则)。因此,如果您决定回滚更改,对象的状态将返回到以前的状态-甚至是已破坏的规则

在对象中有错误的值不是违反OO原则吗?这就是为什么我在后期验证时会有点怀疑。错误的值可能会影响对象的其他功能,即使对象未保存……只要您的对象明确表示允许此类数据并提供验证机制,我认为它不会违反任何规定。