Apariencia
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)
↓
ValidationReportCada 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
| Campo | Entrada | Ejecución | Diagnóstico |
|---|---|---|---|
Name | "A" | Presencia cumple; longitud mínima falla | customer.name.short |
Email | "incorrecto" | Presencia cumple; formato falla | customer.email.invalid |
Age | 16 | El predicado falla | customer.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.