Skip to content

Caso de uso: validación local ​

Casos de uso · Siguiente: validación contextual

Usa un plan local cuando todas las condiciones pueden resolverse con el candidato en memoria. Es apropiado para presencia, formato, longitud, rangos y relaciones entre propiedades que no consultan servicios externos.

Flujo ​

text
CustomerDraft
    ↓
Name: Required → MinLength → MaxLength
    ↓
Email: Required → Email
    ↓
Age: Must(>= 18)
    ↓
ValidationReport

Cada flecha dentro de un campo representa una dependencia creada por Sequence. Si falla Required, los pasos posteriores de esa secuencia quedan omitidos.

Ejemplo completo ​

csharp
using Greencore.platform.validators;

var plan = Validation.For<CustomerDraft>()
    .Field(x => x.Name, field => field.Sequence(sequence => sequence
        .Required("El nombre es obligatorio.", "customer.name.required")
        .MinLength(3, "El nombre debe tener al menos 3 caracteres.", "customer.name.short")
        .MaxLength(100, "El nombre no puede superar 100 caracteres.", "customer.name.long")))
    .Field(x => x.Email, field => field.Sequence(sequence => sequence
        .Required("El correo es obligatorio.", "customer.email.required")
        .Email("El correo no tiene un formato válido.", "customer.email.invalid")))
    .Field(x => x.Age, field => field
        .Must(age => age >= 18, "Debe ser mayor de edad.", "customer.age.minimum"))
    .Build();

var candidate = new CustomerDraft("A", "incorrecto", 16);
var report = plan.Validate(candidate);

Console.WriteLine($"Válido: {report.IsValid}");

foreach (var error in report.ForField(
    (CustomerDraft x) => x.Name,
    DiagnosticView.Summary))
{
    Console.WriteLine($"Name: {error.Code} — {error.Message}");
}

foreach (var error in report.ForField(
    (CustomerDraft x) => x.Email,
    DiagnosticView.Summary))
{
    Console.WriteLine($"Email: {error.Code} — {error.Message}");
}

foreach (var error in report.ForField(
    (CustomerDraft x) => x.Age,
    DiagnosticView.Summary))
{
    Console.WriteLine($"Age: {error.Code} — {error.Message}");
}

public sealed record CustomerDraft(string? Name, string? Email, int Age);

Qué sucede ​

CampoEntradaEjecuciónDiagnóstico
Name"A"Presencia cumple; longitud mínima fallacustomer.name.short
Email"incorrecto"Presencia cumple; formato fallacustomer.email.invalid
Age16El predicado fallacustomer.age.minimum

Las reglas de campos distintos son independientes y acumulan sus incumplimientos. Dentro de cada Sequence, una regla posterior depende de todas las anteriores.

Cuándo no basta ​

Si una condición debe consultar un repositorio, usa un plan contextual. Si la validación se repite durante la edición, crea una sesión de formulario a partir del plan.

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