Skip to main content
 首页 » 编程设计

c#-4.0之流畅的验证。继承验证类

2025年02月15日45jyk

我使用了 Fluent 验证器。但有时我需要创建一个规则层次结构。例如:

[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 继承验证类?

请您参考如下方法:

要解决此问题,您必须更改 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; 
}