gpt4 book ai didi

c# - MVC C# - 多个 AbstractValidator 的 FluentValidation 复合验证器

转载 作者:太空宇宙 更新时间:2023-11-03 15:36:01 25 4
gpt4 key购买 nike

我有一个 MVC 应用程序,它有很多 AbstractValidator<T>每个 View 模型。这是设计使然,因为我使用 SimpleInjector注入(inject)查询以命中我们的数据库,我不想让构造函数在一个验证器中注入(inject)。我创建了下面的类,它是每个 View 模型的验证器,但它不调用我的 When和其他自定义验证规则,仅调用简单规则。任何帮助将不胜感激。谢谢。

public class CompositeValidator<T> : AbstractValidator<T>
{
private ICollection<IValidator> _validators = new List<IValidator>();

public CompositeValidator(IEnumerable<IValidator<T>> validators = null)
{
if (validators == null) return;

foreach (var validator in validators)
{
_validators.Add(validator);

var enumerator = validator.GetEnumerator();

while (enumerator.MoveNext())
{
AddRule(enumerator.Current);
}
}
}

public override ValidationResult Validate(ValidationContext<T> context)
{
var errorsFromOtherValidators = _validators.SelectMany(x => x.Validate(context).Errors);

return new ValidationResult(errorsFromOtherValidators );
}
}

这里有两个验证器的例子

public class PersonValidator : AbstractValidator<PersonVm>
{
public PersonValidator()
{
RuleFor(model => model.FirstName).NotEmpty();
RuleFor(model => model.LastName).NotEmpty();
}
}

public class PersonMustBeRegisteredValidator : AbstractValidator<PersonVm>
{
private readonly IQuery<PersonExists> _query;

public PersonMustBeRegisteredValidator(IQuery<ReturnPerson> query)
{
_query = query;

Custom(model =>
{
var person = _query.Select(new { model.Id });

if (person == null) return new ValidationFailure("Id", "Person does not exist");

return null;
});
}
}}

最佳答案

这确实有效。我发现了一个我忘记的验证拦截器,它没有触发我的验证。

关于c# - MVC C# - 多个 AbstractValidator<T> 的 FluentValidation 复合验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31859621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com