Skip to content

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); // True

La 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.com

La 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 ​

EntradaAceptaciónContinuación
null o vacíoRechazo de fábricaMostrar mensaje; no construir estado definitivo
incorrectoRechazo de formatoSolicitar corrección
Dirección con espacios externosAceptación con normalización en fábricaUsar created.Value, no la entrada original
Dirección mayor al máximoRechazo de longitudCorregir 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.

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