Skip to content

Convenciones del uso cotidiano ​

Índice · Inicio rápido · Migración

Elegir una composición ​

IntenciónForma recomendada
Varias reglas dependientes de un campoFieldSequence(selector, configure)
Reglas independientes del mismo campoField(selector, configure)
Dependencia entre composiciones u objetos completosSequence(configure)
Aplicabilidad de un grupoWhen(condition, configure)
Alternativas válidasAnyOf(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 ​

LlamadaCódigoTexto
Required()validation.requiredEl valor es obligatorio.
Email()validation.emailEl correo no tiene un formato válido.
MinLength(2)validation.minimum-lengthLa longitud mínima del texto es 2.
MaxLength(80)validation.maximum-lengthLa longitud máxima del texto es 80.
Length(2, minimum: true)validation.lengthLa 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.

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