Свободные аргументы фильтра проверки Для collectionValidator - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь отфильтровать аргументы для использования в валидаторе коллекции, используя FluentValidations:

У меня есть общий класс для коллекций, который выглядит следующим образом:

public class ItemCollection<TEntity>
{
    public ItemCollection(TEntity[] items);
    public TEntity[] Items { get; }
}

У меня есть Validator для моей 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 всегда относится к коллекции, а не к отдельному элементу. Как я могу отфильтровать аргументы, переданные в валидатор коллекции?

1 Ответ

0 голосов
/ 05 сентября 2018

Я немного покопался, и это кажется невозможным с SetValidator.SetCollectionValidator как предложено или устарело.Единственное, о чем я могу думать, это:

this.RuleForEach(x => x.Items).Must(x =>
  {
      var validator = new FooDTOValidator(allowedMetadata[x.Key]);
      return validator.Validate(x).IsValid;
  });

Редактировать Как отмечено в комментарии, мы теряем наши сообщения об ошибках.Там может быть шанс сохранить их.Примите это как не проверенный, но согласно документам мы можем получить Корневые данные контекста и добавить наши ошибки, если таковые имеются.

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);
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...