Apariencia
Convenciones del uso cotidiano
Índice · Inicio rápido · Migración
Elegir una composición
| Intención | Forma recomendada |
|---|---|
| Varias reglas dependientes de un campo | FieldSequence(selector, configure) |
| Reglas independientes del mismo campo | Field(selector, configure) |
| Dependencia entre composiciones u objetos completos | Sequence(configure) |
| Aplicabilidad de un grupo | When(condition, configure) |
| Alternativas válidas | AnyOf(configure, code, message) |
FieldSequence(x => x.Email, rules => ...) equivale a Field(x => x.Email, field => field.Sequence(rules => ...)). Usa el mismo motor y preserva rutas, diagnósticos y cancelación. No interpreta automáticamente la navegación por propiedades nulas; utiliza las operaciones de objetos opcionales o requeridos para protegerla.
Mensajes predeterminados
| Llamada | Código | Texto |
|---|---|---|
Required() | validation.required | El valor es obligatorio. |
Email() | validation.email | El correo no tiene un formato válido. |
MinLength(2) | validation.minimum-length | La longitud mínima del texto es 2. |
MaxLength(80) | validation.maximum-length | La longitud máxima del texto es 80. |
Length(2, minimum: true) | validation.length | La longitud mínima del texto es 2. |
Los textos están centralizados y escritos en español. No cambian con la cultura del hilo ni dependen de configuración global mutable. Para otro idioma proporciona mensajes explícitos obtenidos de los recursos de tu aplicación. Los límites miden string.Length (unidades UTF-16), como las reglas existentes.
Las sobrecargas que reciben mensaje siguen rechazando null y texto vacío. Omitir el mensaje selecciona el predeterminado; pasarlo como null no significa «usa el predeterminado». El código personalizado se proporciona junto al mensaje explícito. Los predicados arbitrarios siguen requiriendo mensaje.
Leer resultados de dominio
csharp
foreach (var diagnostic in result.GetDiagnostics())
Console.WriteLine(diagnostic.Message);
var messages = result.ForField("Email", DiagnosticView.Summary);Importa Greencore.Domain.Entity.Validators. GetDiagnostics devuelve hojas del árbol existente, con código, ruta, mensaje y razón original. No altera las categorías ni copia los errores. En éxito entrega una colección vacía.
ForField también funciona en éxito y ofrece Summary, Details y All. Las rutas y los valores de vista inválidos se rechazan tanto en éxito como en fallo: una configuración incorrecta no queda escondida por un candidato válido. Sobre Result<T> puedes usar result.ForField(x => x.Email) con el tipo inferido.
Para un reporte de plataforma, continúa usando EnumerateDiagnostics y ForField. Su resultado describe la evaluación; el resultado de dominio expresa éxito o rechazo de una operación.
Crear un rechazo sencillo
La forma recomendada es BusinessError.Create(code, message).ToResult(). La conversión también admite errores de entidad, modelo y otros errores existentes. Conserva la instancia, las razones y la categoría. No agrega una nueva familia de errores ni una conversión implícita que oculte un fallo.
Las razones tipadas son una ampliación para aportar datos específicos; no son obligatorias para un código y un mensaje.
Compatibilidad
Los builders son mutables; los métodos With... de validadores devuelven otra configuración. Conserva su retorno. Los callbacks y Build del camino recomendado hacen explícita esa separación.
La API anterior WithProperty.Required protege reglas posteriores y WithProperty.When modifica la regla previa. Esas llamadas conservan su semántica. Al migrarlas al builder común expresa dependencias con FieldSequence y condiciones con callbacks; no sustituyas solo los nombres.
Las firmas nuevas no reemplazan las existentes. Se verifican llamadas con argumentos nombrados, expresiones inferidas y mensajes explícitos nulos para comprobar que las sobrecargas no ocultan errores de configuración.