Wie kann ich mithilfe von FluentValidation eine Eindeutigkeitsbeschränkung für eine Reihe von Eigenschaften hinzufügen?
Posted: 03 Jan 2025, 17:21
Ich muss in der Lage sein, mehrere Eigenschaften gleichzeitig zu validieren und sicherzustellen, dass sie einen eindeutigen Namen haben. Mein Anfrageobjekt sieht zum Beispiel so aus:
Jeder dieser Parameter enthält einen Eigenschaftsnamen. Ich muss überprüfen, ob die Eigenschaft Name in allen drei Anforderungsobjektsammlungen eindeutig ist. Ich muss auch die Duplikate in der Nachricht in der Fehlermeldung zurückgeben.
Was ich bisher habe
Ich habe ein Generikum geschrieben Validator:
Dann wird es etwas knifflig zu handhaben:
Was ich vermeiden möchte, ist, dies aus seiner eigenen Validatorklasse herauszunehmen und diesen ganzen Teil in eine .Must-Datei zu packen. Dies liegt daran, dass dieser Eindeutigkeitsvalidator auch an anderer Stelle wiederverwendet werden muss. Ich möchte auch den ListUniqueValidator wenn möglich generisch halten.
Code: Select all
public IReadOnlyCollection IntegerParameters { get; init; }
public IReadOnlyCollection StringParameters { get; init; }
public IReadOnlyCollection BooleanParameters { get; init; }
Was ich bisher habe
Ich habe ein Generikum geschrieben Validator:
Code: Select all
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}";
}
Code: Select all
RuleFor(x => x)
// Concat IntegerParameters, StringParameters, BooleanParameters?
// Get Name property?
// What goes here?
.SetValidator(new ListUniqueValidator());