Свободные проверки. Унаследовать проверочные классы - PullRequest
22 голосов
/ 20 января 2011

Я использовал 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;       
}

Я хочу наследовать правила проверки от UserValidation до RootValidation.Но этот код не работал:

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

Как мне унаследовать класс проверки с помощью FluentValidation?

1 Ответ

32 голосов
/ 21 января 2011

Чтобы решить эту проблему, вы должны изменить UserValidation class на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...