Übergeben Sie ein Element des Objekts an einen Konstruktor von FluentValidation SetValidator

7

Ich verwende FluentValidation, um eine Sammlung innerhalb eines Objekts zu validieren und ein Element der Sammlungselemente mit einem Element des übergeordneten Objekts zu vergleichen.

Die Zielausgabe besteht darin, ValidationFailures für jedes fehlerhafte Element in der Sammlung zu empfangen, nicht nur um die Sammlung zu unterbrechen.

Ich habe eine Software-Bestellung mit einer Liste von Software-Artikeln. Wenn die Bestellung für ein Legacy-System gilt, kann die ausgewählte Software nur Legacy-Software sein, und umgekehrt kann ein Nicht-Legacy-System nur Nicht-Legacy-Software haben.

Mein Modell:

%Vor%

Validatoren:

%Vor%

Wie Sie sehen können, beende ich dies mit einem When für jede Bedingung. Es funktioniert, aber es verletzt DRY und ist nicht praktisch in einer Situation mit mehr als nur zwei Bedingungen zu verwenden.

Ich hätte am liebsten eine einzige RuleForEach, die das tun könnte, keine Pens nötig, etwas wie:

%Vor%

Aber ich kann keine Möglichkeit sehen, IsLegacySystem in diesen Konstruktor zu übergeben.

    
friggle 06.09.2013, 19:12
quelle

3 Antworten

14

Ich entschied mich, dies noch zwei Jahre später zu wiederholen, nachdem ich gesehen hatte, wie viele Ansichten diese unbeantwortete Frage bekommen hatte. Ich habe zwei Antworten gefunden.

Die erste Antwort ist die beste Lösung für die in der Frage beschriebene Situation.

%Vor%

Prädikat Validatoren (a.k.a Muss) können beide Objekt & amp; Eigenschaft als Argumente. Auf diese Weise können Sie direkt mit IsLegacySystem oder einer anderen Eigenschaft des übergeordneten Objekts vergleichen.

Sie sollten diese zweite Antwort wahrscheinlich nicht verwenden. Wenn Sie glauben, dass Sie Argumente in einen Konstruktor von AbstractValidator eingeben müssen, würde ich Sie ermutigen, einen anderen Ansatz zu finden und einen anderen Ansatz zu finden. Mit dieser Warnung gesagt, hier ist ein Weg, um es zu erreichen.

Verwenden Sie im Grunde einen Dummy Must (), um außerhalb des Konstruktors eine Variable außerhalb von Lambda festzulegen. Dann können Sie das verwenden, um diesen Wert in den Konstruktor des zweiten Validators zu bekommen.

%Vor%     
friggle 02.07.2015, 17:55
quelle
5

Ich weiß, dass dies eine alte Frage ist und bereits eine Antwort gegeben wurde, aber ich bin heute auf diese Frage gestoßen und habe herausgefunden, dass die aktuelle Version von FluentValidation (ich verwende 6.2.1.0) eine neue Überladung für SetValidator , mit dem Sie einen Func als Parameter übergeben können.

So können Sie tun:

%Vor%

Hoffentlich kann das jemandem da draußen helfen.

    
Rodrigo Lira 05.09.2016 23:03
quelle
1

Wie wäre es mit diesem Ansatz, der die Methode Custom verwendet:

%Vor%     
Tommy Grovnes 10.09.2013 22:26
quelle

Tags und Links