我有一个CreateRequest
的验证器和UpdateRequest
的另一个验证器。
我很快发现他们是一样的。唯一的区别是一个人有一个Id(UpdateRequest
)。
对于相同的属性,验证是相同的,但实体是不同的。
如何避免重复规则?
目前我有
public class CreateValidator : AbstractValidator<CreateRequest>
{
RuleFor(p => p.Prop1)... // Rule 1
RuleFor(p => p.Prop2)... // Rule 2
RuleFor(p => p.Prop3)... // Rule 3
}
public class UpdateValidator : AbstractValidator<UpdateRequest>
{
RuleFor(p => p.Id)... // Rule 0
RuleFor(p => p.Prop1)... // Rule 1
RuleFor(p => p.Prop2)... // Rule 2
RuleFor(p => p.Prop3)... // Rule 3
}
除规则0外,它们是相同的。
我可以避免重复吗?
答案 0 :(得分:1)
确保您的CreateRequest
和UpdateRequest
实现相同的接口继承自某个基类(或从一个基类继承)。
public CreateRequest: Request{...}
public UpdateRequest: Request{...}
使用受限泛型类型参数创建通用验证器类。
public RequestValidator: AbstractValidator<T> where T: Request
{
RequestValidator()
{
RuleFor(p => p.Prop1)... // Rule 1
RuleFor(p => p.Prop2)... // Rule 2
RuleFor(p => p.Prop3)... // Rule 3
}
}
使用继承创建实际验证器。
public CreateRequestValidator: RequestValidator<CreteRequest>
{
CreateRequestValidator()
{ }
}
public UpdateRequestValidator: RequestValidator<UpdateRequest>
{
UpdateRequestValidator()
{
RuleFor(p => p.Id)...
}
}