避免FluentValidations中的重复

时间:2017-11-07 17:25:54

标签: c# .net dry fluentvalidation

我有一个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外,它们是相同的。

我可以避免重复吗?

1 个答案:

答案 0 :(得分:1)

  1. 确保您的CreateRequestUpdateRequest实现相同的接口继承自某个基类(或从一个基类继承)。

    public CreateRequest: Request{...}
    public UpdateRequest: Request{...}
    
  2. 使用受限泛型类型参数创建通用验证器类。

    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
        }
    }
    
  3. 使用继承创建实际验证器。

    public CreateRequestValidator: RequestValidator<CreteRequest>
    {
        CreateRequestValidator()
        { }
    }
    public UpdateRequestValidator: RequestValidator<UpdateRequest>
    {
        UpdateRequestValidator()
        {
             RuleFor(p => p.Id)...           
        }
    }