如何创建带有特定验证错误消息的自定义FluentValidation PropertyValidator

本文关键字:消息 错误 验证 自定义 PropertyValidator FluentValidation 何创建 创建 | 更新日期: 2023-09-27 18:29:09

我有几个不同的类,它们的Name属性类型为string,但在每种情况下验证名称的规则都是相同的,例如,不能为null,不能在1到32个字符之间,不能包含某些无效/符号字符等。

我正在使用FluentValidation库进行验证。我对它很陌生,但我喜欢迄今为止所看到的。我首先为对象模型中的每个类创建AbstractValidator<T>派生的验证类,以验证它们的属性。我很快意识到我正在复制代码来验证各个类的Name属性,因此决定创建一个NameValidator自定义属性验证器(即自定义PropertyValidator派生类)。其目的是将四到五个重复的名称验证逻辑封装在一个地方。

然而,我不喜欢这个解决方案的地方(基于我的新手理解)是,我不能根据验证失败的标准指定不同的、特定的验证错误消息,因为错误消息必须在构造函数中定义并传递到基类。换句话说,验证错误消息绑定到类类型,而不是IsValid(...)覆盖中的运行时逻辑。例如,如果名称太长,我想提供一条特定的消息,说明这一点,而不是一条复合消息,说明验证由于十几种不同的可能原因之一而失败,并让用户找出哪一个是真正的罪魁祸首。也许这是可能的,我只是错过了它,或者也许属性验证器根本不打算支持多种类型验证的概念。

我考虑的下一种方法是创建一个从AbstractValidator<string>派生的NameValidator类,并使用各种形式的RuleFor语句:RuleFor(name => name).Foo(...)等,这有助于定义特定的验证错误消息。但是,这"感觉不对",因为AbstractValidator<T>用于验证对象,而PropertyValidator用于验证属性。如果您对这种方法的有效性(或其他方面)有任何想法/建议,我们将不胜感激。

因此,我的问题是,使用FluentValidation库以可重用的方式将各种属性验证逻辑封装在一起,同时保持提供非常具体的验证错误消息的能力,准确描述验证失败的原因,推荐的方法是什么?

如何创建带有特定验证错误消息的自定义FluentValidation PropertyValidator

如果是我,我会使用NameValidator : AbstractValidator<string>方法。Name符合太多的要求,这使得它本身就是一个对象。

同样在语义上,PropertyValidator用于表示对象的单一类型的约束,而不是单一属性