Skip to content

Diagnósticos y opciones de ejecución ​

Índice · Anterior: persistencia · Siguiente: consistencia

Motivación ​

Una persona necesita un mensaje que indique qué corregir. Una integración necesita un código estable. Para investigar una condición omitida se necesita la evaluación del árbol. Estas vistas se derivan de una ejecución, pero sirven a consumidores distintos.

Paso 1. Expresar una alternativa con su mensaje ​

csharp
using Greencore.Domain.Entity.Validators;
using Greencore.Domain.Entity.Validators.Diagnostics;
using Greencore.platform.validators;

var plan = Validation.For<Contact>()
    .Field(x => x.Channel, f => f.AnyOf(a => a
        .Must(v => v == "email", "Selecciona email.", "channel.email")
        .Must(v => v == "phone", "Selecciona phone.", "channel.phone"),
        "channel.choice", "Selecciona email o phone."))
    .Build();
var input = new Contact("fax");
var report = plan.Validate(input);
var result = EntityValidator.For<Contact>().WithRules(plan).Validate(input);

public sealed record Contact(string Channel);

Es un fragmento autocontenido de configuración y ejecución. Los siguientes fragmentos se insertan antes de la declaración de Contact si se copian en un programa con instrucciones de nivel superior.

Paso 2. Elegir una vista ​

Para código cotidiano puede consultarse directamente result.ForField("Channel", DiagnosticView.Summary) o result.GetDiagnostics(), importando Greencore.Domain.Entity.Validators. En éxito devuelve una colección vacía. El acceso al error del siguiente fragmento sigue disponible para recorridos avanzados.

csharp
var platformMessages = report.ForField("Channel", DiagnosticView.Summary);
var domainMessages = result.Error.ForField("Channel", DiagnosticView.Summary);
VistaResultado para fax
Summarychannel.choice: un mensaje para corregir el campo
Detailschannel.email y channel.phone: causas terminales
AllGrupo y ambas causas

Solo consulta result.Error cuando result.IsError. ForField compara rutas exactamente; pedir Address no incluye automáticamente Address.City. La sobrecarga con expresión obtiene la ruta sin evaluar la propiedad.

GetDomainDiagnostics() conserva su recorrido de hojas para consumidores existentes. ForField se encuentra en Greencore.Domain.Entity.Validators.Diagnostics; DiagnosticView es el enum de plataforma. No se ha creado un segundo enum con los mismos valores.

Paso 3. Elegir acumulación o cortocircuito ​

csharp
var options = new RuleEvaluationOptions(RuleExecution.ShortCircuit, RuleDetail.Trace);
var validator = EntityValidator.For<Contact>().WithRules(plan);
var validated = await validator.ValidateAsync(input, ruleSet: null, options: options);

En entidad, las opciones llegan al interior de los planes y ShortCircuit detiene también las siguientes reglas registradas tras un fallo. Una regla personalizada es una unidad: el validador no modifica sus decisiones internas. AnyOf sigue buscando una alternativa satisfactoria; el cortocircuito no cambia el significado lógico de la alternativa.

Paso 4. Inspeccionar un reporte contextual ​

csharp
var model = ModelValidator.For<Contact, QueryContext>(b => b.Include(plan));
var evaluation = await model.EvaluateAsync(input, context, options);

Este fragmento supone un QueryContext y una instancia context definidos por la aplicación. EvaluateAsync devuelve ValidationReport también en éxito, lo que permite examinar Trace. ValidateAsync conserva la API que devuelve un resultado de dominio.

EntityValidator sigue devolviendo Result<T>; para inspeccionar una traza completa exitosa de un plan local, ejecuta el plan directamente. Las razones de árbol de un fallo conservan la evaluación asociada, pero un resultado exitoso de entidad no es un reporte.

Paso 5. Interpretar cancelación ​

Los planes locales asíncronos pueden registrarse con WithRules. La entidad exige ValidateAsync para ejecutarlos. Los planes síncronos evaluados desde esa entrada también reciben el token entre nodos. El token debe pasarse a los servicios; cancelar no interrumpe por la fuerza código que ignore la señal.

Las invariantes locales siguen rechazando planes asíncronos. La coordinación de ediciones pertenece a las sesiones de plataforma y no a esta consulta de diagnósticos.

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