0Pricing
C# Academy · Aula

Regras personalizadas e condicionais

Crie uma lógica de validação complexa e condicional.

Regras personalizadas e condicionais é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

Além dos validadores integrados

A validação no mundo real frequentemente precisa de lógica personalizada: um valor que deve passar por uma verificação de domínio ou uma regra que só se aplica em determinadas condições. O FluentValidation oferece suporte a ambos com Must, When e tipos de validadores personalizados.

O predicado Must

Must recebe um predicado que retorna true quando o valor é válido. É a maneira mais simples de expressar uma lógica arbitrária diretamente na regra.

RuleFor(c => c.Username)
    .Must(name => !name.Contains(" "))
    .WithMessage("Username cannot contain spaces.");

Must com acesso ao objeto inteiro

Uma sobrecarga de Must fornece o objeto pai e o valor da propriedade, permitindo verificações entre propriedades.

RuleFor(o => o.DiscountedPrice)
    .Must((order, discounted) => discounted <= order.OriginalPrice)
    .WithMessage("Discounted price cannot exceed original price.");

Regras condicionais com When

When aplica uma regra somente se uma condição for satisfeita. Aqui, um endereço de envio é obrigatório apenas para pedidos físicos.

RuleFor(o => o.ShippingAddress)
    .NotEmpty()
    .When(o => o.RequiresShipping);

O modificador Unless

Unless é o inverso de When: a regra é executada a menos que a condição seja verdadeira.

RuleFor(o => o.CouponCode)
    .NotEmpty()
    .Unless(o => o.IsGift);

Agrupando condições

Coloque várias regras em um único bloco When(...) para compartilhar uma condição de forma organizada entre todas elas.

When(o => o.RequiresShipping, () =>
{
    RuleFor(o => o.ShippingAddress).NotEmpty();
    RuleFor(o => o.PostalCode).NotEmpty();
});

Lógica personalizada assíncrona com MustAsync

Quando sua verificação precisa acessar o banco de dados ou uma API, use MustAsync. Valide o modelo com ValidateAsync.

RuleFor(u => u.Email)
    .MustAsync(async (email, cancellation) =>
        !await _repository.EmailExistsAsync(email))
    .WithMessage("Email is already registered.");

Escrevendo um validator personalizado reutilizável

Para lógicas reutilizadas entre projetos, escreva um método de extensão em IRuleBuilder. Assim, as regras personalizadas se tornam validadores de primeira classe que podem ser encadeados.

public static class CustomValidators
{
    public static IRuleBuilderOptions<T, string> ValidSlug<T>(
        this IRuleBuilder<T, string> rule)
    {
        return rule.Matches("^[a-z0-9-]+$")
            .WithMessage("Must be a lowercase slug.");
    }
}

Usando o validator personalizado

Depois de definido, o método de extensão pode ser encadeado como qualquer validator integrado, mantendo seus validadores expressivos.

RuleFor(p => p.Slug).NotEmpty().ValidSlug();

O método Custom para controle total

Para resultados complexos, Custom permite adicionar falhas de validação de forma imperativa usando um contexto.

RuleFor(o => o.Items).Custom((items, context) =>
{
    if (items.Count == 0)
        context.AddFailure("An order must contain at least one item.");
});

Modos de cascata

Por padrão, todos os validadores de uma cadeia são executados mesmo depois que um deles falha. Defina CascadeMode.Stop para interromper a execução na primeira falha, evitando verificações redundantes ou inseguras.

RuleFor(c => c.Email)
    .Cascade(CascadeMode.Stop)
    .NotEmpty()
    .EmailAddress();

Verificação rápida

Teste regras condicionais e personalizadas.

Recapitulação

As regras personalizadas e condicionais tornam o FluentValidation flexível: Must para predicados diretamente na regra (com uma sobrecarga que expõe o objeto inteiro), When/Unless para condições, blocos When agrupados, MustAsync para verificações que exigem E/S, extensões reutilizáveis de IRuleBuilder, o método imperativo Custom e modos de Cascade para controlar o fluxo de avaliação.

Perguntas Frequentes

A aula “Regras personalizadas e condicionais” é grátis?

Sim — o texto completo de “Regras personalizadas e condicionais” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Regras personalizadas e condicionais”?

Crie uma lógica de validação complexa e condicional. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Regras personalizadas e condicionais”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Validação com anotações de dados
  2. Regras do FluentValidation
  3. Regras personalizadas e condicionais
  4. Integrando validação com APIs
← Voltar para C# Academy