【问题标题】:How to set custom validator for a property that return Task using Fluent Validator如何使用 Fluent Validator 为返回 Task 的属性设置自定义验证器
【发布时间】:2021-05-24 07:30:39
【问题描述】:

我正在尝试在异步返回对象列表的属性上设置自定义验证器

public Task<IList<ComplexType>> Property { get; set; }

除了在属性上调用.Result之外,还有其他方法吗?

RuleForEach(x => x.Property.Result).SetValidator(new MyComplexValidator());

【问题讨论】:

  • @JohnathanBarclay 在我的情况下,该属性返回一个创建成本高昂的值,因此应缓存以备将来使用。异步操作只执行一次:第一次被请求。操作完成后,操作结果会被缓存并立即返回

标签: c# asp.net-core .net-core async-await fluentvalidation


【解决方案1】:

我完全同意@Johnathan 的评论,属性不应该是异步的,我强烈建议你重新审视你的设计。

但是要回答您的问题,实际上无法在 Task 上调用 RuleForEach(),因为它需要一个可枚举的,而 Task 是不可枚举的。作为一种解决方法,您可以使用 MustAsync() 来触发任务,然后使用另一个验证器来验证您的复杂类型。检查下面的示例。

public class ComplexType
{
}

public class SomeType
{
    public Task<IList<ComplexType>> Property { get; set; }
}

public class ComplexTypeValidator : AbstractValidator<ComplexType>
{
    public ComplexTypeValidator()
    {
        //Your Validation Logic Here
    }
}

public class SomeTypeValidator : AbstractValidator<SomeType>
{
    public SomeTypeValidator(IValidator<ComplexType> complexTypeValidator)
    {
        RuleFor(o => o.Property)
            .MustAsync(async (property, cancellationToken) =>
            {
                var propertyResult = await property;
                return propertyResult.Aggregate(true, (result, o) => result && complexTypeValidator.Validate(o).IsValid);
            });
    }
}

在此示例中,我使用 MustAsync() 异步触发属性,并为 ComplexType 使用了另一个验证器。不幸的是,您也不能在 MustAsync 中使用 RuleForEach(),因此您必须像示例中那样自己遍历列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多