FluentObjectValidator es una biblioteca de validación pequeña y simple que proporciona una interfaz fluida para la configuración de reglas.
La biblioteca está destinada a proporcionar una alternativa a la validación basada en atributos de un modelo (requiredTribute, StringLengthAttribute, etc.).
La biblioteca se dirige a .NET Standart 1.0, .NET 4.0, .NET 4.5
La biblioteca está disponible como un paquete Nuget.
Estos son los pasos que lo ayudarán a configurar la validación en su aplicación.
Lo primero es lo primero, deberá decidir qué información le gustaría recibir, cuándo cierto modelo no aprobó la validación.
Las clases principales que proporcionan la funcionalidad de validación son:
Validator : devuelve un valor booleano que indica que la validación aprobada o no.Validator<TError> - Devuelve una instancia de objeto ValidationResult<TError> , que contiene un valor booleano y una colección de objetos TError personalizados que le mostrarán exactamente, cuál de las reglas no pasó.Después de decidir qué validador usar, todo lo que tiene que hacer es heredar de él y agregar las configuraciones, así:
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 ( ) ) ;
}
}Esto nos lleva al siguiente paso.
Para configurar las reglas que sus objetos deben seguir, debe crear clases de configuración para cada uno de los tipos que desea validar.
Dependiendo del validador elegido, todas las configuraciones heredan de ValidationConfiguration<TObject> o ValidationConfiguration<TObject, TError> .
ValidationConfiguration<TObject> public class ProductDTOConfiguration : ValidationConfiguration < ProductDTO >
{
public ProductDTOConfiguration ( )
{
Property ( x => x . Title )
. IsRequired ( )
. HasRule ( x => x . Length <= 10 ) ;
}
}Después de seleccionar la propiedad, puede agregar las reglas de validación de manera fluida.
Puede definir cualquier regla con un método HasRule , pero hay varios atajos predefinidos como IsRequired disponible para todos los objetos, y HasMinLength , HasMaxLength , HasLengthInRange , MatchesRegex disponible solo para cadenas.
La validación ocurre secuencialmente en un orden, las reglas se definieron, y devuelve false tan pronto como una de las reglas no se aprobó, o true si todos pasaban.
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" ) ) ;
}
}Configurar la validación, que devuelve errores personalizados en caso de fallas es un poco más compleja.
Después de seleccionar una propiedad y definir una regla, ahora debe agregar un delegado que se usará para crear el objeto de error si la regla no pasa.
La validación también ocurre secuencialmente en un orden, se definieron las reglas, pero si una de las reglas no pasa, el error se agrega al resultado y la validación continúa.
Puede configurar la validación para omitir el resto de las reglas para una propiedad actual, o para un objeto completo, en caso de que no pase una regla específica. Se puede hacer pasando los parámetros booleanos opcionales correspondientes stopValidationOnError y terminateValidationOnError en el método HasRule . Ambos son falsos de forma predeterminada.
El método IsRequired siempre omite el resto de las reglas para una propiedad, ya que no necesitamos verificar otras reglas si la propiedad es, por ejemplo, igual a NULL.
Las reglas de acceso directo como IsRequired , HasMaxLength se implementan a través de métodos de extensión, por lo que puede agregar fácilmente sus propios atajos a su proyecto.
Después de configurar las reglas, ahora puede crear la instancia de su validador y usarla donde desee.
var res = validator . Validate ( obj ) ;Cada validador expone un solo método público 'validar', que está disponible a través de interfaces:
public interface IValidator < TError >
{
ValidationResult < TError > Validate < TObject > ( TObject target ) ;
}
public interface IValidator
{
bool Validate < TObject > ( TObject target ) ;
}Es por eso que puede usarlo fácilmente con inyección de dependencia:
services . AddSingleton < IValidator , MyValidator > ( ) container . Register < IValidator < MyCustomError > , MyValidator > ( Lifestyle . Singleton ) ;Todas las configuraciones se cargan y validan durante la creación de la instancia de validador, por lo que es mejor usarlo como un singleton.
Este proyecto tiene licencia bajo la licencia MIT; consulte el archivo de licencia para obtener más detalles.
La forma en que ocurre la configuración de la regla se inspiró en Entity Framework 6, y su forma de configurar las relaciones entre las entidades.