Apariencia
Entradas y objetos de valor: una política de aceptación
Índice · Anterior: motivación · Siguiente: invariantes
Motivación
Una validación de formato y una fábrica no siempre aceptan lo mismo. La regla técnica EmailRule comprueba una forma básica; Email.Create también limita longitud, interpreta la dirección y normaliza el texto. Duplicar la política en una pantalla crea el riesgo de mostrar «válido» y fallar al construir el valor.
Usa DomainValidationRule.FromFactory cuando la aceptación deba coincidir con la fábrica. Usa la regla técnica cuando deliberadamente solo quieras esa comprobación básica. El adaptador pertenece al dominio y devuelve una definición que puede usar el builder de plataforma.
Paso 1. Definir una regla reutilizable
csharp
using Greencore.Domain.Entity.Validators;
using Greencore.domain.valueobjects;
using Greencore.platform.validators;
var acceptedEmail = DomainValidationRule.FromFactory<string?, Email>(
"email.factory", Email.Create, "email.acceptance");
var plan = Validation.For<string?>().Add(acceptedEmail).Build();La fábrica se ejecuta una vez por evaluación. Si rechaza, el diagnóstico usa su mensaje y el código público email.acceptance. El código es elegido por el consumidor; no se copia automáticamente el código específico del error de fábrica. No se retiene el valor construido como evidencia.
Paso 2. Comprobar la entrada
csharp
var input = " ana@example.com ";
var report = plan.Validate(input);
Console.WriteLine(report.IsValid); // TrueLa aceptación coincide con Email.Create(input). La variable input todavía contiene los espacios: validar no modifica ni normaliza el candidato.
Paso 3. Construir el valor para continuar
csharp
var created = Email.Create(input);
if (created.IsError)
Console.WriteLine(created.Error.Message);
else
Console.WriteLine(created.Value.Value); // ana@example.comLa segunda llamada construye el valor que se usará en el estado o en la escritura. Si solo necesitas construir un valor una vez y no necesitas un reporte de campos, llama directamente a la fábrica. El adaptador es útil para integrar esa política en un plan, no para obligar a comprobar dos veces todo dato.
Paso 4. Reutilizar en un campo de dominio
csharp
var validator = EntityValidator.For<Draft>(b => b
.Field(x => x.Email, f => f.Add(acceptedEmail)));
var result = validator.Validate(new Draft("incorrecto"));
public sealed record Draft(string? Email);Los fragmentos de esta página son secuenciales; el último reutiliza la definición del primero. Para el flujo con todos los tipos y referencias, ejecuta DomainValidation.cs.
Flujos de resultado
| Entrada | Aceptación | Continuación |
|---|---|---|
null o vacío | Rechazo de fábrica | Mostrar mensaje; no construir estado definitivo |
incorrecto | Rechazo de formato | Solicitar corrección |
| Dirección con espacios externos | Aceptación con normalización en fábrica | Usar created.Value, no la entrada original |
| Dirección mayor al máximo | Rechazo de longitud | Corregir aunque la forma básica sea aceptable |
La fábrica adaptada debe ser una comprobación de construcción sin efectos externos. Una excepción técnica se propaga. El adaptador no transforma excepciones en «entrada inválida».
Qué ocurre con default
default(Email) no llama a la fábrica. Comprueba IsInitialized si un valor puede provenir de inicialización predeterminada. Esto también afecta moneda, nombres, teléfono, URL y fecha. La tabla de valores predeterminados distingue los casos; cero por ciento sí es un valor admitido.