Skip to content

Validación de entidades

EntityValidator<TEntity> evalúa reglas y devuelve Result<TEntity>. Si todas pasan, conserva la entidad original; si alguna falla, devuelve un árbol de errores.

Un validador completo

Requiere el módulo Validators.

csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Validators;

var validador = EntityValidator.For<Cliente>()
    .WithRule(cliente => cliente.Nombre != cliente.Correo,
        "El nombre y el correo deben ser diferentes.")
    .WithMember(cliente => cliente.Nombre,
        reglas => reglas.Required("El nombre es obligatorio."))
    .WithMember(cliente => cliente.Correo, reglas => reglas
        .Required("El correo es obligatorio.")
        .Must(correo => correo.Contains('@'), "El correo debe contener @."))
    .WithMember(cliente => cliente.Edad,
        reglas => reglas.Must(edad => edad >= 18, "Debe ser mayor de edad."));

var resultado = validador.Validate(new Cliente("Ana", "ana@example.com", 17));

foreach (var error in resultado.ErrorsOfType<Error>())
    Console.WriteLine(error.Text);

record Cliente(string Nombre, string Correo, int Edad);

Salida esperada: Debe ser mayor de edad.. La comprobación de correo es deliberadamente sencilla; solo exige el carácter @.

Contrato de las reglas

  • WithRule evalúa la entidad completa.
  • WithMember selecciona un miembro mediante una expresión.
  • Must considera válido un valor cuando el predicado devuelve true.
  • Required rechaza null y cadenas vacías o compuestas por espacios.
  • Cero, false y colecciones vacías son valores presentes para Required. Añade una regla específica si necesitas rechazarlos.

Cuando falla Required, no se ejecutan los demás predicados de ese miembro, independientemente del orden de registro. Sin Required, tus predicados pueden recibir valores nulos.

Reutilización y aislamiento

La configuración fluida es inmutable: cada WithRule o WithMember devuelve un nuevo validador. Conserva el valor retornado. Las ejecuciones generan árboles de error independientes y acumulan fallos de los distintos grupos.

Una entidad nula provoca ArgumentNullException. Las excepciones de tus predicados se propagan; no se convierten automáticamente en errores de validación.

Uso personal limitado. Uso comercial sujeto a autorización escrita.