将条件注入 FluentValidation 规则

Injecting conditions into FluentValidation rule

是否可以将条件(如正则表达式字符串或整数)注入 FluentValidation 验证器?也就是说,假设我有多个客户,每个客户都有不同的密码要求;我可以将其注入验证器吗?

类似于:

public RegistrationValidator(int minLength, string regex)
{
    RuleFor(registration => registration.Login).MinimumLength(minLength);
    RuleFor(registration => registration.Password).Matches(regex);
}

如果是这样,具体是怎么做到的?我能想到的最接近的是root context data,但我觉得这应该比那个更简单。

是的,有可能。您可以从验证 class 中的构造函数方法中注入您想要的任何服务,并创建您的自定义验证器。要定义这样的规则,您有 3 个选项。

1 - When/WhenAsync

2 - 必须/MustAsync

3 - 自定义/CustomAsync

例如,我想在验证器class中注入我的DbContext,加载用户 并为当前用户创建合适的验证。

用户Class:

public class User
{
    public int Id { get; set; }
    public string PhoneNumber { get; set; }
    public string PhoneNumberRegax { get; set; }
}

DTO class :

public class UserDto
{
    public int Id { get; set; }
    public string PhoneNumber { get; set; }
}

验证者Class

public class UserDtoValidator : AbstractValidator<UserDto>
{
    private readonly UserDbContext _context;
    public UserDtoValidator(UserDbContext context)
    {
        _context = context;
        RuleFor(x => x).Must(CheckPhoneNumberRegax);
    }

    private bool CheckPhoneNumberRegax(UserDto inputUser)
    {
        var user = _context.Users.Single(o => o.Id = inputUser.Id);
    
        var r = new Regex(user.PhoneNumberRegax, RegexOptions.IgnoreCase);
        return r.IsMatch(inputUser.PhoneNumber);
    }
}

注意:如果使用 FluentValiation 作为 ASP.NET 核心默认验证器,则不能在验证器中使用异步方法,因为 ASP.NET 核心验证管道是同步的。