C# API中模型与它们的接口设计详解

2020-01-05 09:30:12王冬梅

至于索引器,你会怎么调用它?要访问它的唯一方法是将该对象转换成IDataErrorInfovariable。然后,很少有人会期望看到这样的代码:

var nameError = ((IDataErrorInfo)customer)["Name"];

如果你的UI框架需要这个接口,我建议你将它放到一个基类中,并提供更合理的验证API。一旦加入真实的验证逻辑,甚至可以忽略IDataErrorInfo的存在。

INotifyDataErrorInfo的常规定义

我将分两次讨论INotifyDataErrorInfo接口。在本小节中,我将解释本该如何使用INotifyDataErrorInfo,然后在下一个小节解释我认为应该如何使用它。

INotifyDataErrorInfo接口旨在支持Silverlight 4中的异步验证,其基本想法是修改属性会触发服务调用,被调用的服务最终会结束并更新错误状态。

这个接口的唯一属性是bool HasErrors {get;},不过关于如何实现这个属性并没有硬性规定。我们有两个基本选项,但都不可行。

  1. 阻塞直到异步验证完成,这样会挂起UI。
  2. 立即返回,这会让调用变得不确定,因为你不知道是否存在挂起的异步验证请求。

如果只是进行一般的显示,只要在发生EventHandler<DataErrorsChangedEventArgs> ErrorsChanged事件时更新HasErrors属性即可。不过,如果你尝试单击“保存”按钮同步检查验证状态,那这就不是一个好办法。