C#FluentValidation用于类的层次结构

Nik*_*mov 47 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
}
Run Code Online (Sandbox Code Playgroud)

使用FluentValidation框架验证Derived1和Derived2的适当方法是什么,而不重复Base类字段的规则?

小智 62

public class Derived2Validator : AbstractValidator<Derived2>
{
    public Derived2Validator()
    {
        Include(new BaseValidator());
        Include(new Derived2Validator());
        RuleFor(d => d.Derived1Name).NotNull();
    }
}
Run Code Online (Sandbox Code Playgroud)

Derived2Validator不需要继承BaseValidatorDerived1Validator.该Include方法将包括基本验证器的规则.

  • 我会采用这种方法,因为它有利于构图而不是继承,这对于优秀的开发者来说是一个黄金法则 (14认同)
  • 如果包含Include(new Derived2Validator()),那将是一个无限循环。 (4认同)

Yan*_*eus 52

一种方法如下:

public class Base
{
    public string BaseName { get; set; } 
}

public class Derived1 : Base
{
    public string Derived1Name { get; set; }
}

public class BaseValidator<T> : AbstractValidator<T> where T : Base
{
    public BaseValidator()
    {
        RuleFor(b => b.BaseName).NotNull();
    }
}

public class Derived1Validator : BaseValidator<Derived1>
{
    public Derived1Validator()
    {
        RuleFor(d => d.Derived1Name).NotNull();
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,首先要创建基本验证器,使其接受泛型类型参数,并指定泛型类型必须是类型base.设置基类的一般规则并继续.

对于验证基类的子类的任何验证器,您将从baseValidator继承那些验证器,其中T将是您的派生类类型.

  • 谢谢你的回答! (2认同)
  • 如果我现在有一个“ICollection&lt;Base&gt;”并且想要验证它怎么办? (2认同)