Apariencia
Migración hacia la API recomendada
La biblioteca mantiene las APIs anteriores para que los consumidores existentes continúen compilando. El código nuevo debe elegir una operación por necesidad y conservar la composición explícita.
| Uso anterior | Uso recomendado | Motivo |
|---|---|---|
Require(rule) | Add(rule) | Ambas registran una regla independiente; Add expresa esa semántica |
Add(a).Then(b) | Sequence(s => s.Add(a).Add(b)) | La secuencia conserva y hace visible la dependencia completa |
UpdateAsync(...) | UpdateWithResultAsync(...) | El resultado usa FormValidationState y expone el reporte directamente |
ValidateAsync(...) en sesión | EvaluateAsync(...) | Evalúa de inmediato y devuelve FormValidationOperationResult |
ValidateWithResultAsync(...) | EvaluateAsync(...) | Evita exponer DataState en una validación de formulario |
ForField(path, true) | ForField(path, DiagnosticView.All) | La vista comunica la intención sin un booleano ambiguo |
Length(limit, true, ...) | MinLength(limit, ...) | El nombre expresa la dirección del límite |
Length(limit, false, ...) | MaxLength(limit, ...) | El nombre expresa la dirección del límite |
Add no protege reglas posteriores. Cuando una condición depende de otra, usar una secuencia:
csharp
field.Sequence(sequence => sequence
.Required("El correo es obligatorio.")
.Email("El correo no es válido.")
.Add(CustomerRules.EmailUnique));La migración debe conservar la estructura completa. Si hay una rama independiente, mantenerla fuera de la secuencia:
csharp
// Antes: c depende de b; a es independiente.
builder.Add(a).Add(b).Then(c);
// Después.
builder
.Add(a)
.Sequence(sequence => sequence
.Add(b)
.Add(c));Cuando el dependiente es un grupo, conservarlo como grupo dentro de la secuencia:
csharp
builder.Sequence(sequence => sequence
.Add(a)
.AllOf(group => group
.Add(b)
.Add(c)));Las APIs avanzadas siguen disponibles para integrar reglas de dominio, construir árboles o inspeccionar trazas. El código introductorio no necesita NoRuleContext, RuleNode ni RuleDiagnostics.