Guia Prático: Atributos Customizados para Auditoria

Imagine poder adicionar📦 List<T>: Dinamismo além dos Arrays!📦 List<T>: Dinamismo além dos Arrays!Descubra como utilizar List<T> em C# de forma eficiente. Aprenda a criar, manipular e otimizar listas para diferentes cenários com exemplos práticos. rótulos especiais em classes ou métodos que guiem como o seu programa deve se comportar, sem precisar criar regras soltas espalhadas pelo código. É exatamente isso que os atributos customizados fazem: eles adicionam metadados que podem ser lidos e usados para decisões importantes na execução ou em ferramentas de build e análise. Aqui, vamos explorar como criar esses atributos, por que eles são tão úteis e como aplicá-los de maneira prática e organizada.

Tabela de Conteúdo🔗

O que são atributos?🔗

Atributos (do inglês attributes) são metadados que você cola em cima de tipos, métodos, propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. ou outros elementos do seu código para descrever algo especial sobre eles. Esses metadados ficam “acusando presença” na própria definição do código, permitindo que outras partes do sistema (ou até ferramentas externas) entendam como tratar ou interpretar o elemento marcado.

Alguns exemplos de atributos comuns que você já deve ter visto são aqueles usados em frameworks de teste ([Test] ou [Fact]) ou para serialização JSON⚡ System.Text.Json 2.0: Serialização com Source Generators!⚡ System.Text.Json 2.0: Serialização com Source Generators!Descubra como os Source Generators do .NET 8 revolucionam a serialização JSON, proporcionando performance 5x mais rápida e menor uso de memória.. Quando falamos de “customizados”, significa que você mesmo pode criar atributos para suprir necessidades específicas do seu projeto.

Por que usar atributos customizados?🔗

1. Centralização das regras: Em vez de ter trechos de código espalhados que determinam como algo deve se comportar, você deixa isso mais explícito no próprio ponto que deseja anotar.

2. Organização e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. clareza: Anotar classes e métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. com atributos pode tornar o código mais legível, pois fica claro o que cada parte representa e como deve ser tratada.

3. Facilidade de expansão: Novas funcionalidades podem ser adicionadas sem ter que mexer em vários lugares no código. Basta criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. e aplicar um novo atributo onde for necessário.

Como criar um atributo customizado🔗

Criar um atributo customizado é bem simples. É basicamente criar uma classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. que herda do tipo base Attribute e, em seguida, aplicar essa classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. onde for preciso.

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuditoriaAttribute : Attribute
{
    public string Responsavel { get; }
    public DateTime DataCriacao { get; }
    public AuditoriaAttribute(string responsavel)
    {
        Responsavel = responsavel;
        DataCriacao = DateTime.Now;
    }
}

Entendendo o código acima

Exemplo prático: Marcando classes para auditoria🔗

Vamos supor que temos classes🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. de negócio que precisam ter suas ações rastreadas por um sistema de auditoria. Assim, podemos usar nosso AuditoriaAttribute:

[Auditoria("Carlos")]
public class ServicoPagamento
{
    public void Processar()
    {
        // Lógica de processamento
    }
}
[Auditoria("Mariana")]
public class ServicoOrdem
{
    public void GerarOrdem()
    {
        // Lógica para gerar ordem
    }
}

Ao marcar essas classes🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara.:

Esse tipo de anotação pode guiar ferramentas e processos no seu software, por exemplo, gerando logs específicos sempre que um método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. de uma classe anotada for chamado.

Lendo Atributos com Reflection🔗

Para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! extrair os metadados de atributos aplicados, podemos usar Reflection🔍 Reflection: Inspecione Tipos em Tempo de Execução!🔍 Reflection: Inspecione Tipos em Tempo de Execução!Descubra como a Reflection em C# revoluciona a inspeção em tempo real. Aprenda a acessar e invocar membros dinamicamente com segurança.:

var atributos = typeof(ServicoPagamento)
    .GetCustomAttributes(typeof(AuditoriaAttribute), false);
foreach (AuditoriaAttribute attr in atributos)
{
    Console.WriteLine($"Responsável: {attr.Responsavel}, Data: {attr.DataCriacao}");
}

Casos de Uso Avançados🔗

CenárioImplementação
Serialização[JsonPropertyName("nome_alternativo")]
ORM[Table("Clientes")]
Logging[LogNivel(Nivel.Critico)]
Testes[TestMethod]

Exemplo de validação customizada:

public class EmailValidoAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        return new EmailAddressAttribute().IsValid(value);
    }
}

Boas práticas e cuidados🔗

1. Escolha nomes significativos: Um atributo deve ter um nome que explique a sua intenção.

2. Parâmetros🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!Aprenda sobre a técnica de sobrecarga de métodos no C# com exemplos e práticas recomendadas para melhorar a organização e legibilidade do seu código. claros: Se o atributo precisa de parâmetros🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!🎯 Sobrecarga de Métodos: Um Nome, Múltiplos Superpoderes!Aprenda sobre a técnica de sobrecarga de métodos no C# com exemplos e práticas recomendadas para melhorar a organização e legibilidade do seu código., mantenha-os simples e diretos.

3. Evite sobrecarregar com lógica: Atributos servem para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! marcar e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. carregar informações. A lógica principal deve ficar em outro lugar.

4. Use somente onde🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!🎲 Desafio: Analise Dados de Vendas com LINQ e Coleções!Aprenda a usar coleções e LINQ em C# para analisar vendas, filtrar dados e extrair insights estratégicos que otimizem decisões e impulsionem seu negócio. for necessário: Anotar todo o seu código com atributos que não trazem valor🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!🗂️ Dicionários: Acesse Dados por Chaves como um Mestre dos HashMaps!Aprenda a usar dicionários em C# de modo prático e eficiente. Nosso tutorial mostra criação, acesso e otimização para manipular dados com segurança. pode gerar confusão e poluir a base de código.

Desafio Prático🔗

Crie um sistema de logging📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável. com níveis de prioridade:

1. Crie um atributo [LogPrioridade(Nivel)] que possa ser aplicado a métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência.

2. Use Reflection🔍 Reflection: Inspecione Tipos em Tempo de Execução!🔍 Reflection: Inspecione Tipos em Tempo de Execução!Descubra como a Reflection em C# revoluciona a inspeção em tempo real. Aprenda a acessar e invocar membros dinamicamente com segurança. para identificar métodos com o atributo

3. Simule um logger que registre apenas métodos🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. com prioridade >= Nivel.Warning

[LogPrioridade(Nivel.Critico)]
public void ProcessarPagamento() { ... }

Dica:

public enum Nivel { Info, Warning, Error, Critico }

Próximos Passos🔗

Agora que você domina atributos customizados, experimente:

🎯 Dica Profissional: Atributos são poderosos, mas não exagere! Use-os quando precisar de metadados estruturados que serão consumidos por outras partes do sistema.
Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados