collectionValidator 的流利验证过滤器参数
Fluent Validation Filter Arguments For collectionValidator
我正在尝试使用 FluentValidations 过滤要在集合验证器中使用的参数:
我有一个通用的 Class 集合,看起来像:
public class ItemCollection<TEntity>
{
public ItemCollection(TEntity[] items);
public TEntity[] Items { get; }
}
我的 ItemCollection 有一个验证器,如下所示:
public FooCollectionValidator: AbstractValidator<ItemCollection<Foo>>
{
public FooCollectionValidator(IDictionary<string, FooMetadata> allowedMetadata)
{
//Setting Rules using Must works fine
this.RuleForEach(x => x.Items).Must(x => allowedMetadata.ContainsKey(x.Key));
}
}
我需要为每个项目设置一个验证器,但我想为子验证器过滤我的元数据无论我尝试什么方式,我都无法访问能够过滤的项目:
this.RuleForEach(x => x.Items).SetValidator(x =>
{
//I want to filter the metadata by the Key and pass it to the child validator
var metadata = allowedMetadata[x.Key];
return new FooDTOValidator(metadata )
});
这不起作用,因为 X 始终指的是集合而不是单个项目。如何过滤传递给集合验证器的参数?
我摸索了一下,SetValidator
似乎不可能。 SetCollectionValidator
所建议的已被弃用或将被弃用。
我能想到的唯一方法是:
this.RuleForEach(x => x.Items).Must(x =>
{
var validator = new FooDTOValidator(allowedMetadata[x.Key]);
return validator.Validate(x).IsValid;
});
编辑
如评论中所述,我们丢失了错误消息。也许有机会保存它们。将其视为未测试,但根据 docs 我们可以获得 根上下文数据 并添加我们的失败(如果有的话)。
this.RuleForEach(x => x.Items).Custom((x, context) =>
{
var validator = new FooDTOValidator(allowedMetadata[x.Key]);
var result = validator.Validate(x);
if (!result.IsValid)
{
foreach (var failure in result.Errors)
{
context.AddFailure(failure);
}
}
});
我正在尝试使用 FluentValidations 过滤要在集合验证器中使用的参数:
我有一个通用的 Class 集合,看起来像:
public class ItemCollection<TEntity>
{
public ItemCollection(TEntity[] items);
public TEntity[] Items { get; }
}
我的 ItemCollection 有一个验证器,如下所示:
public FooCollectionValidator: AbstractValidator<ItemCollection<Foo>>
{
public FooCollectionValidator(IDictionary<string, FooMetadata> allowedMetadata)
{
//Setting Rules using Must works fine
this.RuleForEach(x => x.Items).Must(x => allowedMetadata.ContainsKey(x.Key));
}
}
我需要为每个项目设置一个验证器,但我想为子验证器过滤我的元数据无论我尝试什么方式,我都无法访问能够过滤的项目:
this.RuleForEach(x => x.Items).SetValidator(x =>
{
//I want to filter the metadata by the Key and pass it to the child validator
var metadata = allowedMetadata[x.Key];
return new FooDTOValidator(metadata )
});
这不起作用,因为 X 始终指的是集合而不是单个项目。如何过滤传递给集合验证器的参数?
我摸索了一下,SetValidator
似乎不可能。 SetCollectionValidator
所建议的已被弃用或将被弃用。
我能想到的唯一方法是:
this.RuleForEach(x => x.Items).Must(x =>
{
var validator = new FooDTOValidator(allowedMetadata[x.Key]);
return validator.Validate(x).IsValid;
});
编辑 如评论中所述,我们丢失了错误消息。也许有机会保存它们。将其视为未测试,但根据 docs 我们可以获得 根上下文数据 并添加我们的失败(如果有的话)。
this.RuleForEach(x => x.Items).Custom((x, context) =>
{
var validator = new FooDTOValidator(allowedMetadata[x.Key]);
var result = validator.Validate(x);
if (!result.IsValid)
{
foreach (var failure in result.Errors)
{
context.AddFailure(failure);
}
}
});