FluentObjectValidator ist eine kleine und einfache Validierungsbibliothek, die eine fließende Schnittstelle für die Regelkonfiguration bietet.
Die Bibliothek soll eine Alternative zur attributbasierten Validierung eines Modells liefern (fordertattribute, StringLengthAttribute usw.).
Die Bibliothek zielt auf .net Standart 1.0, .net 4.0, .net 4.5
Die Bibliothek ist als Nuget -Paket erhältlich.
Hier sind die Schritte, mit denen Sie die Validierung in Ihrer App konfigurieren können.
Das Wichtigste zuerst müssen Sie entscheiden, welche Informationen Sie erhalten möchten, wenn ein bestimmtes Modell die Validierung nicht bestanden hat.
Die Hauptklassen, die die Validierungsfunktionalität liefern, sind:
Validator - Gibt einen booleschen Wert zurück, der angibt, wo die Validierung bestanden oder nicht.Validator<TError> - Gibt eine Instanz des ValidationResult<TError> -Objekts zurück, das einen booleschen Wert enthält, und eine Sammlung benutzerdefinierter TError , die Ihnen genau zeigen, welche der Regeln nicht bestanden haben.Nachdem Sie entschieden haben, welchen Validator Sie verwenden sollen, müssen Sie lediglich davon erben und die Konfigurationen wie SO hinzufügen:
public class MyValidator : Validator
{
public MyValidator ( )
{
AddConfiguration ( new ProductDTOConfiguration ( ) ) ;
AddConfiguration ( new UserDTOConfiguration ( ) ) ;
}
} public class MyValidator : Validator < MyCustomError >
{
public MyValidator ( )
{
AddConfiguration ( new ProductDTOConfiguration ( ) ) ;
AddConfiguration ( new UserDTOConfiguration ( ) ) ;
}
}Dies bringt uns zum nächsten Schritt.
Um die Regeln zu konfigurieren, die Ihre Objekte befolgen sollten, müssen Sie Konfigurationsklassen für jeden der Typen erstellen, die Sie validieren möchten.
Abhängig vom ausgewählten Validator erben alle Konfigurationen von ValidationConfiguration<TObject> oder ValidationConfiguration<TObject, TError> .
ValidationConfiguration<TObject> public class ProductDTOConfiguration : ValidationConfiguration < ProductDTO >
{
public ProductDTOConfiguration ( )
{
Property ( x => x . Title )
. IsRequired ( )
. HasRule ( x => x . Length <= 10 ) ;
}
}Nach der Auswahl der Eigenschaft können Sie die Validierungsregeln fließend hinzufügen.
Sie können alle Regeln mit einer HasRule -Methode definieren, aber es gibt mehrere vordefinierte Verknüpfungen wie IsRequired für alle Objekte und HasMinLength , HasMaxLength , HasLengthInRange , MatchesRegex nur für Strings verfügbar.
Die Validierung erfolgt nacheinander in einer Reihenfolge, in der die Regeln definiert wurden, und gibt false zurück, sobald eine der Regeln nicht verabschiedet wurde oder wenn sie alle true wurden.
ValidationConfiguration<TObject, TError> public class ProductDTOConfiguration : ValidationConfiguration < ProductDTO , MyCustomError >
{
public ProductDTOConfiguration ( )
{
Property ( x => x . Title )
. IsRequired ( ( ) => new MyCustomError ( "Title is required" ) )
. HasRule (
x => x . Length <= 10 ,
( ) => new MyCustomError ( "Title is too long" ) ) ;
}
}Die Konfiguration der Validierung, die im Falle von Ausfällen benutzerdefinierte Fehler zurückgibt, ist etwas komplexer.
Nachdem Sie eine Eigenschaft ausgewählt und eine Regel definiert haben, müssen Sie nun einen Delegierten hinzufügen, mit dem das Fehlerobjekt erstellt wird, wenn die Regel nicht übergeht.
Die Validierung erfolgt auch nacheinander in einer Reihenfolge, in der die Regeln definiert wurden. Wenn jedoch eine der Regeln nicht weitergeht, wird der Fehler zum Ergebnis hinzugefügt und die Validierung wird fortgesetzt.
Sie können die Validierung konfigurieren, um den Rest der Regeln für eine aktuelle Eigenschaft oder für das gesamte Objekt zu überspringen, falls eine bestimmte Regel nicht bestanden wird. Dies kann durch Übergeben der entsprechenden optionalen booleschen Parameter stopValidationOnError und terminateValidationOnError in HasRule -Methode übertragen werden. Beide sind standardmäßig falsch.
IsRequired -Methode überspringt immer den Rest der Regeln für eine Eigenschaft, da wir andere Regeln nicht überprüfen müssen, wenn die Eigenschaft beispielsweise NULL entspricht.
Verknüpfungsregeln wie IsRequired , HasMaxLength werden über Erweiterungsmethoden implementiert, sodass Sie Ihrem Projekt problemlos Ihre eigenen Verknüpfungen hinzufügen können.
Nachdem Sie die Regeln konfiguriert haben, können Sie jetzt die Instanz Ihres Validators erstellen und überall dort verwenden, wo Sie möchten.
var res = validator . Validate ( obj ) ;Jeder Validator enthält eine einzelne öffentliche "Validierungsmethode", die über Schnittstellen erhältlich ist:
public interface IValidator < TError >
{
ValidationResult < TError > Validate < TObject > ( TObject target ) ;
}
public interface IValidator
{
bool Validate < TObject > ( TObject target ) ;
}Deshalb können Sie es problemlos mit Abhängigkeitsinjektion verwenden:
services . AddSingleton < IValidator , MyValidator > ( ) container . Register < IValidator < MyCustomError > , MyValidator > ( Lifestyle . Singleton ) ;Alle Konfigurationen werden während der Erstellung der Validator -Instanz geladen und validiert. Meiner Meinung nach ist es meiner Meinung nach am besten, sie als Singleton zu verwenden.
Dieses Projekt ist unter der MIT -Lizenz lizenziert - finden Sie in der Lizenzdatei Einzelheiten
Die Art und Weise, wie die Regelkonfiguration auftritt, wurde vom Entity Framework 6 inspiriert und seine Art, die Beziehungen zwischen Entitäten zu konfigurieren.