25

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 を使用して検証クラスを継承するにはどうすればよいですか?

4

1 に答える 1

36

これを解決するには、UserValidationクラスをジェネリックに変更する必要があります。以下のコードを参照してください。

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;
}
于 2011-01-21T10:12:40.923 に答える