FluentObjectValidator adalah pustaka validasi kecil dan sederhana yang menyediakan antarmuka lancar untuk konfigurasi aturan.
Perpustakaan dimaksudkan untuk memberikan alternatif untuk validasi berbasis atribut dari suatu model (EnlestAttribute, StringLengthAttribute, dll.).
Perpustakaan menargetkan .NET Standart 1.0, .NET 4.0, .NET 4.5
Perpustakaan tersedia sebagai paket Nuget.
Berikut adalah langkah -langkah yang akan membantu Anda mengonfigurasi validasi di aplikasi Anda.
Hal pertama yang pertama, Anda harus memutuskan informasi apa yang ingin Anda terima, ketika model tertentu tidak melewati validasi.
Kelas utama yang menyediakan fungsionalitas validasi adalah:
Validator - Mengembalikan nilai boolean yang menunjukkan apa validasi yang dilewati atau tidak.Validator<TError> - Mengembalikan contoh objek ValidationResult<TError> , yang berisi nilai boolean, dan kumpulan objek TError khusus yang akan menunjukkan kepada Anda persis, aturan mana yang tidak lewat.Setelah Anda memutuskan validator mana yang akan digunakan, yang harus Anda lakukan adalah mewarisi darinya, dan menambahkan konfigurasi, seperti itu:
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 ( ) ) ;
}
}Ini membawa kita ke langkah berikutnya.
Untuk mengonfigurasi aturan yang harus diikuti oleh objek Anda, Anda perlu membuat kelas konfigurasi untuk masing -masing jenis yang ingin Anda validasi.
Bergantung pada validator yang dipilih, semua konfigurasi mewarisi dari ValidationConfiguration<TObject> atau ValidationConfiguration<TObject, TError> .
ValidationConfiguration<TObject> public class ProductDTOConfiguration : ValidationConfiguration < ProductDTO >
{
public ProductDTOConfiguration ( )
{
Property ( x => x . Title )
. IsRequired ( )
. HasRule ( x => x . Length <= 10 ) ;
}
}Setelah memilih properti, Anda dapat menambahkan aturan validasi secara fasih.
Anda dapat mendefinisikan aturan apa pun dengan metode HasRule , tetapi ada beberapa pintasan yang telah ditentukan seperti IsRequired yang tersedia untuk semua objek, dan HasMinLength , HasMaxLength , HasLengthInRange , MatchesRegex hanya tersedia untuk string.
Validasi terjadi secara berurutan dalam urutan aturan didefinisikan, dan mengembalikan false segera setelah salah satu aturan tidak lewat, atau true jika semuanya berlalu.
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" ) ) ;
}
}Mengkonfigurasi validasi, yang mengembalikan kesalahan khusus jika kegagalan sedikit lebih kompleks.
Setelah memilih properti dan mendefinisikan aturan, Anda sekarang perlu menambahkan delegasi yang akan digunakan untuk membuat objek kesalahan jika aturan tidak lewat.
Validasi juga terjadi secara berurutan dalam urutan aturan ditentukan, tetapi jika salah satu aturan tidak lewat, kesalahan ditambahkan ke hasil, dan validasi berlanjut.
Anda dapat mengonfigurasi validasi untuk melewatkan sisa aturan untuk properti saat ini, atau untuk seluruh objek, jika aturan tertentu tidak lewat. Ini dapat dilakukan dengan melewati parameter boolean opsional yang sesuai stopValidationOnError dan terminateValidationOnError ke dalam metode HasRule . Keduanya salah secara default.
Metode IsRequired selalu melewatkan sisa aturan untuk properti, karena kita tidak perlu memeriksa aturan lain jika properti misalnya sama dengan nol.
Aturan pintasan seperti IsRequired , HasMaxLength diimplementasikan melalui metode ekstensi, sehingga Anda dapat dengan mudah menambahkan pintasan Anda sendiri ke proyek Anda.
Setelah mengkonfigurasi aturan, Anda sekarang dapat membuat contoh validator Anda dan menggunakannya di mana pun Anda mau.
var res = validator . Validate ( obj ) ;Setiap validator memaparkan metode 'validasi' publik tunggal, yang tersedia melalui antarmuka:
public interface IValidator < TError >
{
ValidationResult < TError > Validate < TObject > ( TObject target ) ;
}
public interface IValidator
{
bool Validate < TObject > ( TObject target ) ;
}Itulah mengapa Anda dapat dengan mudah menggunakannya dengan injeksi ketergantungan:
services . AddSingleton < IValidator , MyValidator > ( ) container . Register < IValidator < MyCustomError > , MyValidator > ( Lifestyle . Singleton ) ;Semua konfigurasi dimuat dan divalidasi selama pembuatan instance validator, jadi menurut pendapat saya, yang terbaik adalah menggunakannya sebagai singleton.
Proyek ini dilisensikan di bawah lisensi MIT - lihat file lisensi untuk detailnya
Cara konfigurasi aturan terjadi terinspirasi oleh Entity Framework 6, dan cara mengkonfigurasi hubungan antar entitas.