FluentValidation传递参数
本文关键字:参数 FluentValidation | 更新日期: 2023-09-27 18:18:06
我发现FluentValidation只有几个小时前,我想重写我所有的验证逻辑,所以它将只使用FV。
我有ATM的问题是,我想使用来自输入的数据作为DomainExists()方法的参数。这是可能的还是我必须找到一种绕过FV的方法来实现?
public QuoteValidator()
{
// hardcoded because don't know how to pass input string to RuleFor
var inputeddomain = "http://google.com";
RuleFor(r => r.Domain).NotEqual(DomainExists(inputeddomain));
}
// checks if inputeddomain is in repository (SQL DB)
private string DomainExists(string inputeddomain)
{
var context = new QuoteDBContext().Quotes;
var output = (from v in context
where v.Domain == inputeddomain
select v.Domain).FirstOrDefault();
if (output != null) { return output; } else { return "Not found"; }
}
感谢@bpruitt-goddard提示,我让它工作。这是我的问题的解决办法(希望能对某人有所帮助)。
public QuoteValidator()
{
RuleFor(r => r.Domain).Must(DomainExists).WithMessage("{PropertyValue} exists in system!");
}
private bool DomainExists(string propertyname)
{
var context = new QuoteDBContext().Quotes;
var output = (from v in context
where v.Domain == propertyname
select v.Domain).FirstOrDefault();
if (output != null) { return false; } else { return true; }
}
您可以使用FluentValidation的Must
方法从输入对象传入额外的数据。
RuleFor(r => r.Domain)
.Must((obj, domain) => DomainExists(obj.InputDomain))
.WithErrorCode("MustExist")
.WithMessage("InputDomain must exist");
虽然这可以工作,但不建议在验证层检查数据库是否存在,因为这是验证与验证。相反,这种检查应该在业务层完成。