Как добавить ограничение уникальности для набора свойств с помощью FluentValidation?C#

Место общения программистов C#
Ответить
Anonymous
 Как добавить ограничение уникальности для набора свойств с помощью FluentValidation?

Сообщение Anonymous »

Мне нужно иметь возможность проверять несколько свойств одновременно и гарантировать, что они имеют уникальное имя. Например, мой объект запроса выглядит так:

Код: Выделить всё

public IReadOnlyCollection IntegerParameters { get; init; }
public IReadOnlyCollection StringParameters { get; init; }
public IReadOnlyCollection BooleanParameters { get; init; }
Каждый из этих параметров содержит имя свойства. Мне нужно убедиться, что свойство Name уникально в трех коллекциях объектов запроса. Мне также нужно вернуть дубликаты в сообщении об ошибке.
Что у меня есть на данный момент
Я написал общий валидатор:

Код: Выделить всё

internal class ListUniqueValidator : PropertyValidator
{
public override string Name => "ListUniqueValidator";

public override bool IsValid(ValidationContext context, IList list)
{
var duplicates = list
.GroupBy(x => x)
.Where(group => group.Count() == 1)
.Select(group => group.Key.ToString())
.ToList();

context.MessageFormatter.AppendArgument("Duplicates", string.Join(", ", duplicates));
return duplicates.Count > 0;
}

/// 
protected override string GetDefaultMessageTemplate(string errorCode)
=> "{PropertyName} must contain all unique elements. Duplicates: {Duplicates}";
}
Тогда с этим становится немного сложнее:

Код: Выделить всё

RuleFor(x => x)
// Concat IntegerParameters, StringParameters, BooleanParameters?
// Get Name property?
// What goes here?
.SetValidator(new ListUniqueValidator());

Чего мне хотелось бы избежать, так это вынести это из собственного класса валидатора и поместить весь этот фрагмент в .Must. Это связано с тем, что этот валидатор уникальности необходимо повторно использовать и в другом месте. Я также хотел бы сохранить ListUniqueValidator универсальным, если это вообще возможно.


Подробнее здесь: https://stackoverflow.com/questions/793 ... luentvalid
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»