2017-11-20 2 views
0

Im Rahmen einer datenorientierten Anwendung verwendet, die eine Datenbank:Welche Art von Validierungen mit FluentValidations?

ich FluentValidations nur wurde mit Dingen wie zu bestätigen, dass eine Id war eine positive Zahl ist, oder, dass ein Argument ist nicht null: Dinge, die hat die Datenbank nicht getroffen.

Aber nach einiger Zeit, fragte ich mich, warum würde ich nicht Dinge validieren, die tatsächlich Abfrage der Datenbank. So entschied ich mich, weiter zu validieren und jetzt, Validator validiert nicht nur, dass die angegebene Id eine positive Zahl ist, sondern auch, dass die Entität existiert.

Ist dies das Ziel eines Validators. Misse ich es falsch? Sollte ein Validator auch komplexe Geschäftsregeln prüfen?

Antwort

1

IMHO, ist es völlig in Ordnung FluentValidator für die Überprüfung von Geschäftsregeln zu verwenden. Es ist jedoch besser, Geschäftsregeln von einer einfachen Validierung zu trennen. Wenn es zum Beispiel eine ASP.NET-Anwendung ist, sollte eine allgemeine Validierung in der Präsentationsschicht durchgeführt werden (wie bei Verwendung von ModelState), aber Geschäftsregeln sollten in der Domänenschicht (z. B. in einem Dienst oder decorator) ins Spiel kommen.

Sie können diese Links finden nützlich:

  1. ValidateModelAttribute
  2. Validate command using Decorator pattern
  3. Simple Injector(fast DI container, great for decorators)
+0

Danke! Was ist die allgemeine Faustregel? Ich mache eine Web-API und die Validatoren agieren gegen jede Anfrage. Vielleicht kann ein Validator in diesem Aspekt gängige Dinge wie eine GetById abfangen, wo die ID nicht gefunden wird. Aber ist es sinnvoll, eine komplexe Bedingung zu validieren, die die Anforderung gemäß den Geschäftsregeln erfüllen sollte? Oder sollte ich die Validierung in einer niedrigeren Schicht durchführen und nur eine entsprechende Ausnahme auslösen, wenn die Bedingung nicht erfüllt ist? – SuperJMN

+1

Es hängt von Ihren Anforderungen ab. Ich denke, es ist sinnvoll, eine grundlegende Validierung in Ihren Controllern durchzuführen (Sie können versuchen, FluentValidation in die integrierte Pipeline zu integrieren und ModelState oder holet validator selbst zu verwenden und manuell Validate aufzurufen) und 400 im Fehlerfall zurückgeben. Aber für komplexere, Domänen- und DB-bezogene Validierungen sollten Sie Ihre Entität besser in einer niedrigeren Ebene validieren (ich hoffe, Sie haben einen Service, ein Repository oder einen Befehls-Handler). Es kann auch manuell oder mit Dekorator/Interceptor erfolgen. Um einen Fehler anzuzeigen, können Sie eine Ausnahme auslösen oder ein Validierungsergebnis zurückgeben –

0

Es gibt 2 Möglichkeiten, diese Art von Validierungen durchzuführen:
1.Erstellen Sie eine Klasse und erben Sie von PropertyValidator und verwenden Sie sie zur Entity-Validierungsklasse.

public class UniqueValidator<T> : PropertyValidator where T:class 
{ 
//inject the repository 
protected override bool isValid(PropertyValidatorContext context){ 
    //check the validity 
} 
} 

2.Create Methode directy zur EntityValidation Klasse

public class EntityValidation : AbstractValdiation<Entity>{ 
//inject the repository 


//your current validations 

public bool UniqueValue(Entity instance){ 
    //query to validate 
} 
} 
+0

Sorry, aber ich frage, ob es eine schlechte Idee ist komplexe Business-Logik in einem überprüfen Validator oder nicht. – SuperJMN

Verwandte Themen