流畅的验证.继承验证类

Iva*_*tin 22 fluentvalidation c#-4.0

我用了Fluent Validator.但有时我需要创建一个规则层次结构.例如:

[Validator(typeof(UserValidation))]
public class UserViewModel
{
    public string FirstName;
    public string LastName;
}

public class UserValidation : AbstractValidator<UserViewModel>
{
    public UserValidation()
    {
        this.RuleFor(x => x.FirstName).NotNull();
        this.RuleFor(x => x.FirstName).NotEmpty();

        this.RuleFor(x => x.LastName).NotNull();
        this.RuleFor(x => x.LastName).NotEmpty();
    }
}

public class RootViewModel : UserViewModel
{
    public string MiddleName;       
}
Run Code Online (Sandbox Code Playgroud)

我想从UserValidation继承验证规则到RootValidation.但是这段代码不起作用:

public class RootViewModelValidation:UserValidation<RootViewModel>
{
    public RootViewModelValidation()
    {
        this.RuleFor(x => x.MiddleName).NotNull();
        this.RuleFor(x => x.MiddleName).NotEmpty();
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用FluentValidation继承验证类?

小智 33

要解决此问题,您必须将UserValidation类更改为generic.见下面的代码.

public class UserValidation<T> : AbstractValidator<T> where T : UserViewModel
{
    public UserValidation()
    {
        this.RuleFor(x => x.FirstName).NotNull();
        this.RuleFor(x => x.FirstName).NotEmpty();

        this.RuleFor(x => x.LastName).NotNull();
        this.RuleFor(x => x.LastName).NotEmpty();
    }
}

[Validator(typeof(UserValidation<UserViewModel>))]
public class UserViewModel
{
    public string FirstName;
    public string LastName;
}

public class RootViewModelValidation : UserValidation<RootViewModel>
{
    public RootViewModelValidation()
    {
        this.RuleFor(x => x.MiddleName).NotNull();
        this.RuleFor(x => x.MiddleName).NotEmpty();
    }
}

[Validator(typeof(RootViewModelValidation))]
public class RootViewModel : UserViewModel
{
    public string MiddleName;
}
Run Code Online (Sandbox Code Playgroud)