Skip to content

Caso de uso: reglas reutilizables ​

Anterior: opciones · Casos de uso

Usa definiciones reutilizables cuando varios planes comparten la misma condición, identidad y diagnóstico. La definición conserva configuración; el candidato, el contexto y la evidencia se reciben en cada ejecución.

Flujo ​

text
Catálogo CustomerRules
    ↓ definición compartida
Plan de creación ─┐
Plan de edición  ─┼─ Add(definición)
Plan de importación┘
    ↓
Cada plan genera NodeId por aparición
    ↓
RuleId y diagnóstico se conservan

Ejemplo completo ​

csharp
using Greencore.platform.rules;
using Greencore.platform.validators;

public static class CustomerRules
{
    public static LocalValidationDefinition<string?> EmailRequired { get; } =
        ValidationRule.For(
            "email.required",
            new RequiredRule<string?>(),
            "customer.email.required",
            "El correo es obligatorio.");

    public static LocalValidationDefinition<string?> EmailFormat { get; } =
        ValidationRule.For(
            "email.format",
            new EmailRule(),
            "customer.email.invalid",
            "El correo no tiene un formato válido.");
}

var localPlan = Validation.For<CustomerDraft>()
    .Field(x => x.Email, field => field.Sequence(sequence => sequence
        .Add(CustomerRules.EmailRequired)
        .Add(CustomerRules.EmailFormat)))
    .Build();

var creation = localPlan.Validate(new CustomerDraft("incorrecto"));

var importPlan = Validation.For<ImportRow>()
    .Field(x => x.PrimaryEmail, field => field.Sequence(sequence => sequence
        .Add(CustomerRules.EmailRequired)
        .Add(CustomerRules.EmailFormat)))
    .Field(x => x.BillingEmail, field => field.Sequence(sequence => sequence
        .Add(CustomerRules.EmailRequired)
        .Add(CustomerRules.EmailFormat)))
    .Build();

var import = importPlan.Validate(new ImportRow("[email protected]", ""));

foreach (var error in import.ForField(
    (ImportRow x) => x.BillingEmail,
    DiagnosticView.Summary))
{
    Console.WriteLine(error.Message);
}

public sealed record CustomerDraft(string? Email);
public sealed record ImportRow(string? PrimaryEmail, string? BillingEmail);

Identidades ​

RuleId identifica la regla lógica, por ejemplo email.required. NodeId identifica cada aparición dentro del plan. En el plan de importación, la misma definición aparece en dos campos y recibe identificadores de aparición distintos; así ambos diagnósticos conservan su ruta.

Si solo necesitas una regla una vez, usa los atajos del builder. Una definición explícita resulta útil para catálogos, evidencia tipada o una identidad lógica compartida.

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