Apariencia
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 conservanEjemplo 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("valid@example.com", ""));
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.