C#FluentValidation用于类的层次结构
我有一个数据类层次结构
public class Base { // Fields to be validated } public class Derived1 : Base { // More fields to be validated } public class Derived2 : Base { // More fields to be validated }
使用FluentValidation框架validationDerived1和Derived2的适当方法是什么,而不重复Base类字段的规则?
一种方法如下:
public class Base { public string BaseName { get; set; } } public class Derived1 : Base { public string Derived1Name { get; set; } } public class BaseValidator : AbstractValidator where T : Base { public BaseValidator() { RuleFor(b => b.BaseName).NotNull(); } } public class Derived1Validator : BaseValidator { public Derived1Validator() { RuleFor(d => d.Derived1Name).NotNull(); } }
因此,首先要创建基本validation器,使其接受generics类型参数,并指定generics类型必须是base
类型。 设置基类的一般规则并继续。
对于validation基类的子类的任何validation器,您将从baseValidatorinheritance那些validation器,其中T将是您的派生类类型。
public class Derived2Validator : AbstractValidator { public Derived2Validator() { Include(new BaseValidator()); Include(new Derived2Validator()); RuleFor(d => d.Derived1Name).NotNull(); } }
Derived2Validator
不需要inheritanceBaseValidator
或Derived1Validator
。 Include
方法将包括基本validation器的规则。
我尝试了Include()方法,但是由于.net core中的swagger生成的模型没有显示任何更改,因此没有给出我想要的结果。 什么工作是创建一个新类inheritance有具有基类的validation器
/// /// Base Class for entity validator classes that specifies a base validator class /// /// The Type being validated /// The validater assigned to the base type of the type being validated public abstract class BaseAbstractValidator : AbstractValidator where TBaseClass : IEnumerable { protected BaseAbstractValidator() => AppendRules(); /// /// Add the set of validation rules /// /// private void AppendRules() where TValidationRule : IEnumerable { var rules = (IEnumerable )Activator.CreateInstance(); foreach (var rule in rules) { AddRule(rule); } } }