Zum Fußzeileninhalt springen
Iron Academy Logo
C# Tools & Produktivität

Fluent Validation in C# - Das leistungsstarke und doch einfache Datenvalidierungstool

Tim Corey
43m 58s

Die Datenvalidierung ist eine der Säulen der zuverlässigen Softwareentwicklung, und in modernen .NET-Anwendungen benötigen Sie eine robuste, wartbare und skalierbare Methode, um damit umzugehen. An dieser Stelle kommt FluentValidation ins Spiel, eine beliebte .NET-Bibliothek zur Erstellung von stark typisierten Validierungsregeln.

In seinem ausführlichen Video-Tutorial "Fluent Validation in C# - The Powerful Yet Easy Data Validation Tool" führt Tim Corey die Zuschauer Schritt für Schritt durch die Verwendung von FluentValidation. In diesem Artikel folgen wir Tims Ausführungen und fassen die wichtigsten Punkte und Codebeispiele zusammen, während wir relevante Konzepte wie benutzerdefinierte Validatoren, Verkettung von Validatoren, ASP.NET-Integration und Unterstützung für ältere Laufzeiten wie .NET Core 3.1 und .NET Standard 2.0 integrieren.

Einführung: Warum FluentValidation?

Zu Beginn des Videos erklärt Tim, wie sich die Datenüberprüfung oft wiederholt und unübersichtlich wird. So verstößt beispielsweise das Kopieren und Einfügen ähnlicher Validierungsregeln in verschiedenen Teilen eines Projekts gegen das DRY-Prinzip (Don't Repeat Yourself). Stattdessen stellt er FluentValidation vor - eine .NET-Validierungsbibliothek, die kostenlos und leistungsfähig ist und sogar mit Modellen funktioniert, die Sie nicht besitzen, was sie ideal für kommerzielle Projekte macht.

Tim betont, wie wichtig es ist, das Gelernte zu üben, und verweist die Zuschauer auf seine wöchentliche Challenge-Reihe zum Aufbau von Fähigkeiten.

Demo App Übersicht

Tim verwendet eine WinForms-Demo-Anwendung, in die ein Benutzer etwas eingeben kann:

  • Vorname

  • Nachname

  • Kontostand

  • Geburtsdatum

Obwohl es sich um eine UI-Demo handelt, lassen sich die Validierungsprinzipien ebenso gut auf ASP.NET Core, API-Tests und sogar Konsolenanwendungen anwenden.

Die Gefahr, sich auf Benutzereingaben zu verlassen

An dieser Stelle erinnert Tim die Entwickler: "Vertrauen Sie niemals dem Benutzer." Eingaben können oft unvorhersehbar sein, wie z. B. die Eingabe von "zehn" für das Alter anstelle von 10. Es ist wichtig, diese Eingaben zu überprüfen, bevor sie in der Datenbank gespeichert werden.

Er skizziert beispielhafte Validierungsregeln:

  • Vor- und Nachnamen sollten nicht leer sein.

  • Der Kontostand sollte den finanziellen Regeln entsprechen, z. B. einer Mindestanforderung für finanzielles Sponsoring.

  • Das Geburtsdatum sollte nicht in der Zukunft liegen oder über 120 Jahre alt sein.

Wo soll die Validierungslogik hin?

Tim erforscht Optionen für die Konfiguration von Validatoren:

  • Innerhalb des UI-Formulars

  • In der Modellklasse mit Datenannotationen

  • In einer separaten Validierungsklasse unter Verwendung von FluentValidation

Er weist darauf hin, dass Datenkommentare begrenzt sind und oft nicht geeignet sind, wenn mit externen Bibliotheken gearbeitet wird oder wenn eine benutzerdefinierte Validierungslogik erforderlich ist.

Installation von FluentValidation

Mit Visual Studio fügt Tim FluentValidation über NuGet zu seinem Projekt hinzu. Er installiert die Version 8.1.0, weist aber darauf hin, dass FluentValidation plattformübergreifend und kompatibel ist mit:

  • .NET Standard 2.0

  • .NET Core

  • ASP.NET

  • WPF

  • Xamarin

  • Und mehr

Tims Setup funktioniert auch für diejenigen, die Unterstützung für ältere Laufzeiten benötigen, einschließlich FluentValidation 11, das .NET Core 3.1 und früher unterstützt.

Erstellen einer Validator-Klasse

Tim demonstriert die Erstellung von stark typisierten Validierungsregeln, indem er eine neue Klasse erstellt:

public class PersonValidator : AbstractValidator<Person>
public class PersonValidator : AbstractValidator<Person>

Diese Klasse enthält die gesamte Validierungslogik für das Modell Person. Unter Verwendung der fluent-Schnittstelle werden die Validierungsregeln innerhalb des Konstruktors definiert.

Erste Validierungsregel: Vorname

Tim schreibt eine Regel unter Verwendung eines Lambda-Ausdrucks:

RuleFor(p => p.FirstName).NotEmpty();
RuleFor(p => p.FirstName).NotEmpty();

Er verwendet einen Var-Validator, um das Person-Objekt zu validieren:

var validator = new PersonValidator();
ValidationResult results = validator.Validate(person);
var validator = new PersonValidator();
ValidationResult results = validator.Validate(person);

Anschließend durchläuft er alle Validierungsfehler in einer Schleife, um benutzerfreundliche Meldungen in einem Listenfeld anzuzeigen.

Zeichenlänge und benutzerdefinierte Meldungen

Tim erweitert die Validierungsregel:

RuleFor(p => p.FirstName)
    .NotEmpty().WithMessage("First name is empty")
    .Length(2, 50).WithMessage("Length of first name is invalid");
RuleFor(p => p.FirstName)
    .NotEmpty().WithMessage("First name is empty")
    .Length(2, 50).WithMessage("Length of first name is invalid");

Mithilfe von Verkettungsvalidatoren stellt diese Regel sicher, dass der Name weder leer noch zu kurz/lang ist. Tim führt Cascade(CascadeMode.Stop) ein, um die Validierung beim ersten Fehler zu beenden.

Benutzerdefinierte Validierung: Gültige Zeichen in Namen

Tim implementiert einen benutzerdefinierten Validator mit einer Methode namens:

private bool BeAValidName(string name)
private bool BeAValidName(string name)

Dabei werden Leerzeichen und Bindestriche entfernt und sichergestellt, dass die Zeichenkette nur Unicode-Buchstaben enthält, damit internationale Zeichen unterstützt werden können.

Die benutzerdefinierte Regel wird wie folgt angewendet:

.Must(BeAValidName).WithMessage("{PropertyName} contains invalid characters");
.Must(BeAValidName).WithMessage("{PropertyName} contains invalid characters");

Diese Methodenstruktur eignet sich perfekt für die Anpassung an andere Felder, z. B. für eine benutzerdefinierte Logikfunktion zur Validierung von Postleitzahlen:

private bool BeAValidPostcode(string postcode)
{
    // Add custom logic here to specify a valid postcode format
}
private bool BeAValidPostcode(string postcode)
{
    // Add custom logic here to specify a valid postcode format
}

Sie könnten sie dann in einem Validator wie:

RuleFor(c => c.Postcode).Must(BeAValidPostcode)
    .WithMessage("Please specify a valid postcode");
RuleFor(c => c.Postcode).Must(BeAValidPostcode)
    .WithMessage("Please specify a valid postcode");

Dies ist bei kommerziellen Projekten üblich, die die öffentliche Klasse CustomerValidator oder andere domänenspezifische Validatoren erfordern.

Verwendung integrierter Variablen in Fehlermeldungen

Tim zeigt, wie man Nachrichten dynamisch mit Platzhaltern wie:

  • {PropertyName}

  • {Gesamtlänge}

  • {MinLength} und {MaxLength}

Dies führt zu kontextbezogenen Fehlermeldungen wie:

"Length of First Name is invalid (was 105)"
"Length of First Name is invalid (was 105)"

Dadurch wird es für die Benutzer einfacher, Eingabefehler zu beheben.

Nachname und Lokalisierung

Tim kopiert die Validierungslogik von FirstName für LastName, dank der wiederverwendbaren Formatierung mit {PropertyName}. Er erwähnt auch WithLocalizedMessage() für ASP.NET oder globale Anwendungen, die mehrsprachige Unterstützung benötigen.

Wichtig: CascadeMode ist regelspezifisch

Tim stellt klar, dass CascadeMode.Stop für einzelne Regeln gilt, nicht global für das gesamte Modell. Wenn sowohl FirstName als auch LastName leer sind, werden beide Regeln ausgelöst - auch wenn CascadeMode eingestellt ist.

Überprüfung des Geburtsdatums

Als nächstes fügt Tim eine Regel hinzu, um sicherzustellen, dass das Geburtsdatum realistisch ist:

private bool BeAValidAge(DateTime dob)
{
    var currentYear = DateTime.Now.Year;
    var dobYear = dob.Year;
    return dobYear <= currentYear && dobYear > (currentYear - 120);
}
private bool BeAValidAge(DateTime dob)
{
    var currentYear = DateTime.Now.Year;
    var dobYear = dob.Year;
    return dobYear <= currentYear && dobYear > (currentYear - 120);
}

Wird so verwendet:

RuleFor(p => p.DateOfBirth)
    .Must(BeAValidAge)
    .WithMessage("Invalid {PropertyName}");
RuleFor(p => p.DateOfBirth)
    .Must(BeAValidAge)
    .WithMessage("Invalid {PropertyName}");

Dies ist ein gutes Muster für die Validierung zeitlicher Daten wie Datumsangaben oder Verfallsfenster.

Abschließende Überlegungen und Empfehlungen

Abschließend fasst Tim die wichtigsten Vorteile von FluentValidation zusammen:

  • Zentralisierte Validierungslogik

  • Leicht zu erstellende benutzerdefinierte Validatoren

  • Kompatibel mit .NET 5 sowie neueren und älteren Laufzeiten

  • Unterstützt komplexe Modelle, Listen und asynchrone Regeln

  • Ideal sowohl für Bastler als auch für kommerzielle Projekte

Er ermutigt die Betrachter, die FluentValidation-Dokumentation für die fortgeschrittene Verwendung, einschließlich verschachtelter Regeln, E-Mail-Eigenschaftsüberprüfung und mehr, zu erkunden.

Abschluss

FluentValidation befähigt .NET-Entwickler, stark typisierte Validierungsregeln zu erstellen, die wiederverwendbar, aussagekräftig und wartbar sind. Ganz gleich, ob Sie mit .NET Core oder .NET 8 entwickeln oder Legacy-Systeme mit .NET Core 3.1 verwalten, mit dieser Bibliothek wird die Datenvalidierung zum Kinderspiel.

Mit Funktionen wie:

  • Die fließende Schnittstelle für die Erstellung von Regeln

  • Unterstützung für benutzerdefinierte Logik zur Validierung von Postleitzahlen

  • Einfache Integration in Visual Studio

  • Kompatibilität mit API-Tests, WinForms und ASP.NET

  • Robuste Handhabung von Validierungsfehlern

FluentValidation ist ein Muss in Ihrem .NET-Toolkit. Für weitere Einzelheiten sehen Sie sich bitte das vollständige Video an und abonnieren Sie Tims Kanal für weitere aufschlussreiche Videos über C#.

Tipp: Wenn Sie FluentValidation zum ersten Mal verwenden, versuchen Sie, Ihren eigenen CustomerValidator mit Regeln für Eigenschaften wie public string Name, string Postcode und mehr zu implementieren. Testen Sie die Übersetzung mit einer Mock-API oder einem UI-Formular, um praktische Erfahrungen zu sammeln.

Hero Worlddot related to Fluent Validation in C# - Das leistungsstarke und doch einfache Datenvalidierungstool
Hero Affiliate related to Fluent Validation in C# - Das leistungsstarke und doch einfache Datenvalidierungstool

Verdienen Sie mehr, indem Sie teilen, was Sie lieben

Erstellen Sie Inhalte für Entwickler, die mit .NET, C#, Java, Python oder Node.js arbeiten? Verwandeln Sie Ihr Fachwissen in ein zusätzliches Einkommen!

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an