【问题标题】:Injecting conditions into FluentValidation rule将条件注入 FluentValidation 规则
【发布时间】:2022-01-28 06:22:15
【问题描述】:

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

类似:

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

如果是这样,它是如何完成的?我能想到的最接近的是root context data,但我觉得这应该比那更简单。

【问题讨论】:

    标签: c# asp.net-core fluentvalidation


    【解决方案1】:

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

    1 - 何时/何时异步

    2 - 必须 / MustAsync

    3 - 自定义/自定义异步

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

    用户类:

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

    DTO 类:

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

    验证器类

    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 Core 默认验证器,则不能在验证器中使用 Async 方法,因为 ASP.NET Core 验证管道是同步的。

    【讨论】:

    • 这不是我真正希望做的,因为正则表达式包含在模型中。因此,它必须从客户端包含在内。我希望从模型中分离规则并将其保存在其他地方(即配置文件)。
    • 在这种情况下,答案具有相同的逻辑。如果您在 appsettings.json 中保存您的验证正则表达式,那么您必须在我的示例中注入 IConfiguration 而不是 DbContext,其余部分相同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    相关资源
    最近更新 更多