我有几个不同的类,其Name属性类型为string
,但在每种情况下验证名称的规则是相同的,例如不能为空,1到32个字符之间,不得包含某些无效/符号字符等。 - 你明白了。
我正在使用FluentValidation库进行验证。我对它很新,但就像我到目前为止看到的那样。我首先为对象模型中的每个类创建AbstractValidator<T>
派生验证类,以验证其属性。我很快意识到我正在复制代码以验证各个类的Name属性,因此决定创建一个NameValidator
自定义属性验证器(即自定义PropertyValidator
派生类)。目的是将四个或五个重复的名称验证逻辑封装在一个地方。
我不喜欢这个解决方案(基于我的新手理解)是我无法根据验证失败的标准指定不同的特定验证错误消息,因为错误消息必须在构造函数中定义并传递给基类。换句话说,验证错误消息与类类型相关联,而不是IsValid(...)
覆盖中的运行时逻辑。例如,如果名称太长,我想提供一条特定的消息,而不是一条复合消息,表示验证因十几种不同的原因之一而失败,并让用户弄清楚哪一个是真正的罪魁祸首。也许这可能是某种方式,我只是错过了它,或者一个属性验证器根本不是为了支持多种验证的概念。
我考虑的下一个方法是创建一个NameValidator
类,该类派生自AbstractValidator<string>
并使用格式为RuleFor
等的各种RuleFor(name => name).Foo(...)
语句,这有助于定义特定的验证错误消息。但是,这个&#34;感觉错了&#34;因为AbstractValidator<T>
用于验证对象,而PropertyValidator
用于验证属性。任何关于这种方法的有效性(或其他方面)的想法/建议都将受到赞赏。
所以我的问题是使用FluentValidation库以可重用的方式将各种属性验证逻辑封装在一起的推荐方法是什么,同时保持提供非常具体的验证错误消息的能力,这些消息准确描述了验证失败的原因?
答案 0 :(得分:1)
如果是我,我会使用NameValidator : AbstractValidator<string>
方法。
Name
符合过多要求的事实使其成为一个独立的对象。
同样在语义上,PropertyValidator
用于表示单个类型的约束而不是对象的单个属性