验证组件的设计和使用
前面通过自己的开发已基完成了验证组件的设计工作,验证的原则是当验证的条件不成立时表示的是验证没有通过,而条件成立时表示通过.如:需要验证一个string属性不为null或空则设计的这个验证器的名称就叫StringNotNullOrEmptyValidator,而验证数据范围的叫做Int32InRangeValidator.这样的验证原则比较的符合我们的思维,其实质就是验证成功的条件.
在没有进行具体的应用之前这种方式应当说是看起来很正常的,但结合到了具体的使用后,问题出来了.
我的应用环境是这样的,验证组件基本上都是在Domain层中进行数据规则的验证,当验证的条件不满足时就引发对应的DomainException,因为系统需要支持多种语言,而Domain层之上是Service层,这一层极有可能面要开发为WCF的Service,我就想将这些DomainException的异常信息以一种方式告诉到UI层,再通过这个UI来获取到对应语言的异常提示,所以这个DomainException之中我设计有一个ErrorCode之类的东西,UI层通过这个ErrorCode来获到对应的错误提示,并且显示出来.
每一个验证器都有一个ValidateName的属性,我想要用这个值来生成ErrorCode,而这个值,如果这里的StringIsNotNullOrEmptyValidator则ValidateName取名为XXXNotNullOrEmpty,但如果这个ErrorCode到了UI之后,我想开发UI的人一定会认为没有满足XXX为null或Empty的条件,这里就是失败条件,两者所表达出来的是相反的内容.
想要解决这个问题,就必须在进行验证时一一进行比较,进行转换.或者直接将验证器的名称设计为XXXIsNullOrEmpty。但这样又会产生很多新的问题,特别是有一个名为CustomValidator的验证器,这个验证器有一个名为OnCustomValidate的Event,通过这个Event来进行验证,当验证User的UserName属性不存在相同的时,是这个验证器的命名为UserNameExists(因为UI需要的是这个)。但,所需编写的验证方法名为OnUserNameNotExists这里当设置时就需要设置 userNameExitsValidator.OnCustomValidate = OnUserNameNotExists;怎么看怎么有问题。
综上所述,如果在设计验证器组件时能够设计为验证失败条件,则以上问题就能够很好的解决。如:UserNameExists是验证失败条件,则:对应的event为:OnUserNameExists,而StringNotNullOrEmpty则为StringIsNullOrEmpty。
这样就能够有效的解决相互不不匹配的问题了。并且验证失败条件虽然不像验证成功条件那么样子符合我们的思维,但其实更加的合理。