Skip to content

Integrar resultados, errores, localización y validación ​

Platform reúne capacidades reutilizables, pero no exige adoptar un marco monolítico. Los resultados, errores, razones, mensajes, reglas, validadores y herramientas de concurrencia tienen responsabilidades diferenciadas. Usa cada módulo por sí solo o compón varios cuando el flujo necesite compartir información.

Una integración común conecta cuatro conceptos:

  1. Validación evalúa condiciones y determina qué reglas incumple una entrada.
  2. Diagnósticos describen cada incumplimiento mediante una ruta, un código estable y datos de evidencia.
  3. Mensajes resuelven una plantilla con parámetros y cultura cuando la aplicación necesita presentar texto.
  4. Resultados y errores comunican el desenlace de la operación y conservan causas consultables.

De una regla a una respuesta ​

El plan de validación conserva las reglas y sus definiciones. Cada ejecución recibe una entrada y devuelve un reporte; los diagnósticos identifican qué falló sin forzar la presentación inmediata de una cadena localizada.

csharp
using Greencore.platform.validators;

var plan = Validation.For<Customer>()
    .Field(x => x.Email, field => field.Sequence(sequence => sequence
        .Required("El correo es obligatorio.", "customer.email.required")
        .Email("El correo no es válido.", "customer.email.invalid")))
    .Build();

var report = plan.Validate(customer);
if (!report.IsValid)
{
    foreach (var diagnostic in report.ForField("Email"))
        Console.WriteLine($"{diagnostic.Code}: {diagnostic.Message}");
}

Los códigos son identificadores para integraciones, telemetría o selección de recursos; no dependen del idioma. Para mensajes traducibles, crea mensajes desde recursos y aporta los valores variables como parámetros. Así una capa de presentación puede resolver el texto según la cultura solicitada sin cambiar la regla ni el contrato del diagnóstico.

Unir un reporte con el modelo de errores ​

Cuando una operación de aplicación debe devolver un fallo, transforma los diagnósticos a razones bajo un error de operación. La raíz explica qué acción no pudo completarse; cada razón identifica el campo y el incumplimiento. Conserva códigos, rutas y evidencia como metadatos según lo que necesiten los consumidores.

csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Errors.Extensions;
using Greencore.Platform.Results;

if (!report.IsValid)
{
    var error = Error.Create("No se pudo registrar el cliente.");
    foreach (var diagnostic in report.EnumerateDiagnostics())
        error.AddReason(new Reason(diagnostic.Message)
            .WithMetadata("Code", diagnostic.Code)
            .WithMetadata("Path", diagnostic.Path));

    return Result<Customer>.Fail(error.Root());
}

return Result<Customer>.Ok(customer);

Este patrón es una opción de integración, no un requisito de Platform: una API puede devolver directamente el reporte, una interfaz puede presentar los diagnósticos por campo y un proceso interno puede registrar códigos y razones sin generar texto de usuario. Elija el límite que corresponda a su contrato.

Localizar en el punto de presentación ​

Message permite describir texto literal o una plantilla traducible sin resolverla demasiado pronto. Un catálogo puede concentrar las claves de un área:

csharp
public sealed class CustomerMessages(IMessageLocalizer localizer)
{
    public Message Required(string field) =>
        Message.FromResource("customer.validation.required", localizer)
            .With("field", field);
}

La regla conserva su código estable; la capa que prepara el diagnóstico o su presentación selecciona la plantilla y los parámetros adecuados. Resuelve el mensaje con el localizador y la cultura de destino al mostrarlo. De esta manera, ni el idioma altera la validez ni una traducción cambia la identidad del error.

Consulta mensajes localizados, catálogos y validación, diagnósticos y evidencia y el modelo de errores para los contratos de cada pieza.

Elegir cuánto combinar ​

CasoComposición posible
Una operación sencilla con éxito o falloResult<T> y Error
Validar una entrada y mostrar sus problemasReglas, ValidationReport y diagnósticos
Presentar fallos en más de un idiomaCódigos, plantillas Message, parámetros y localizador
Devolver fallos estructurados desde una operaciónResult<T> con un Error raíz y razones derivadas de los diagnósticos
Mantener separada la validación del dominioReporte de plataforma adaptado a invariantes y contratos propios

Empieza por el módulo que resuelve tu necesidad inmediata. Añade los demás cuando sus contratos aporten valor; la composición ocurre en los límites de tu aplicación.

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