将条件注入 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 核心验证管道是同步的。
是否可以将条件(如正则表达式字符串或整数)注入 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 核心验证管道是同步的。