在 FluentValidations 中避免重复
Avoiding duplication in FluentValidations
我有一个用于 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 之外,它们是相同的。
我可以避免重复吗?
确保您的 CreateRequest
和 UpdateRequest
实现相同的接口是从某些基础 class(或另一个基础)继承的。
public CreateRequest: Request{...}
public UpdateRequest: Request{...}
创建具有受限泛型类型参数的泛型验证器class。
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)...
}
}
我有一个用于 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 之外,它们是相同的。
我可以避免重复吗?
确保您的
CreateRequest
和UpdateRequest
实现相同的接口是从某些基础 class(或另一个基础)继承的。public CreateRequest: Request{...} public UpdateRequest: Request{...}
创建具有受限泛型类型参数的泛型验证器class。
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)... } }