如何为继承自具体类的类使用Fluent Validation编写验证器?
针对具体类继承场景的Fluent Validation实现方案
当子类继承自具体基类时,Fluent Validation不会自动包含基类的验证规则,需要手动通过以下两种方式复用基类的验证逻辑:
方式一:使用Include方法引入基类验证器
如果已编写好针对Base类的验证器,直接在子类验证器中通过Include方法引入即可:
基类验证器示例
public class BaseValidator : AbstractValidator<Base> { public BaseValidator() { RuleFor(x => x.A).NotEmpty().WithMessage("A不能为空"); RuleFor(x => x.B).Length(2, 10).WithMessage("B长度需在2-10之间"); } }
子类验证器实现
public class NewValidator : AbstractValidator<New> { public NewValidator() { // 引入基类的所有验证规则 Include(new BaseValidator()); // 添加子类自身属性的验证规则 RuleFor(x => x.C).EmailAddress().WithMessage("C必须是有效的邮箱地址"); RuleFor(x => x.D).NotEmpty().WithMessage("D不能为空"); } }
这种方式优势在于灵活,无需修改原有基类验证器结构,适合基类验证器仅针对Base类的场景。
方式二:基于泛型基类验证器实现继承
如果需要在多个子类验证器中复用基类规则,可将基类验证器定义为泛型类型,让子类验证器直接继承:
泛型基类验证器示例
public class BaseValidator<T> : AbstractValidator<T> where T : Base { public BaseValidator() { RuleFor(x => x.A).NotEmpty().WithMessage("A不能为空"); RuleFor(x => x.B).Length(2, 10).WithMessage("B长度需在2-10之间"); } }
子类验证器实现
public class NewValidator : BaseValidator<New> { public NewValidator() { // 直接添加子类自身属性的验证规则即可,基类规则已自动继承 RuleFor(x => x.C).EmailAddress().WithMessage("C必须是有效的邮箱地址"); RuleFor(x => x.D).NotEmpty().WithMessage("D不能为空"); } }
这种方式更简洁,适合需要频繁复用基类验证逻辑的场景。
内容的提问来源于stack exchange,提问作者Vaibhav
相关产品推荐
相关产品推荐

