【问题标题】:IDataErrorInfo and the property validation of an objectIDataErrorInfo 和对象的属性验证
【发布时间】:2009-07-14 02:16:49
【问题描述】:

由于我正在尝试学习 WPF,我越来越多地看到使用接口 IDataErrorInfo 将错误绑定到接口。我的问题是我通常将数据验证放在属性的设置器中,而不是放在像 IDataErrorInfo.this[string columnName] 这样的方法中...这是我发现的blog,这让我感到困惑。

在 .Net 3.5 中继续验证数据对象的好方法是什么?我需要在 Setter 和 IDataErrorInfo 调用的方法中实现验证吗?或者只是 IDataErrorInfo?还是在 setter 中调用 IDataErrorInfo?

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

【问题讨论】:

    标签: c# design-patterns .net-3.5


    【解决方案1】:

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

    但是,如果您走这条路,您需要确保在将对象保存到数据库等之前验证对象是否正常。

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

    【讨论】:

    • 对象中有错误的值不违反OO原则吗?这就是让我在后期验证时有点怀疑的原因。即使对象没有保存,错误的值也会影响对象的其他功能...
    • 只要您的对象明确表示它允许此类数据并提供验证机制,我认为它没有违反任何内容。
    【解决方案2】:

    我相信 IDataError 可以带来更丰富的用户体验。就像马克说的那样,它允许更少的中断,特别是在编辑网格时,例如。 Customer 对象的列表。

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

    他的框架还支持 n 级撤消。当您开始编辑业务对象时,会拍摄对象的快照(包括损坏的规则)。因此,如果您决定回滚您的更改,对象的状态将返回到之前的状态 - 甚至是违反规则!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多