Decorator Assíncrono em C#: Logging, Métricas e Cache

Imagine que você precise 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. responsabilidades (como logging, métricas ou gerenciamento de cache) na chamada de métodos assíncronosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance. sem alterar o código original de suas classes. Esse é exatamente o papel do Decorator, um padrão de projeto🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. que permite envolver operações de 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. concreta para acrescentar comportamentos adicionais.

Nesta narrativa, vamos explorar como 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. um _Decorator Assíncrono_ em C#, interceptando as chamadas 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. através de uma interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas.. Dessa forma, você poderá inserir qualquer lógica auxiliar - como logs, medição de tempo de execução ou manipulação de erros - de maneira transparente para as classes reais que executam a tarefa principal.

Visão Geral do Decorator Assíncrono🔗

O Decorator segue a ideia de “embrulhar” um objeto em outro. No contexto assíncrono⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais., isso significa que, ao chamar um método TaskDiferenças entre Threads, Tasks e Delegates em C#Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho. ou TaskDiferenças entre Threads, Tasks e Delegates em C#Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho.<T> a partir da interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas., podemos executar operações adicionais antes 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. depois de delegar a chamada à implementação real.

Esse padrão se torna especialmente útil quando📊 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. você quer centralizar comportamentos transversais (cross-cutting concerns) sem poluir o código de todas as suas 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. concretas.

Exemplo Prático🔗

Para exemplificar, vamos criar uma interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. simples de calculadora para ilustrar como um Decorator pode interceptar chamadas de métodos assíncronosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance.. A ideia é medir o tempo que um método leva para executar🔍 Comandos: Desacople Ações dos Botões!🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. e imprimir essa informação em console, apenas a título de demonstração.

Definindo a Interface

public interface ICalculadora
{
    Task<int> SomarAsync(int a, int b);
    Task<int> MultiplicarAsync(int a, int b);
}

Implementação Concreta

Aqui está a 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 realiza a operação de fato, sem qualquer preocupação adicional:

public class CalculadoraConcreta : ICalculadora
{
    public async Task<int> SomarAsync(int a, int b)
    {
        // Simulando alguma operação assíncrona
        await Task.Delay(300);
        return a + b;
    }
    public async Task<int> MultiplicarAsync(int a, int b)
    {
        // Simulando alguma operação assíncrona
        await Task.Delay(500);
        return a * b;
    }
}

Decorator Assíncrono

Agora, vamos 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. um Decorator que envolve a CalculadoraConcreta (ou qualquer outra implementação de ICalculadora) para 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. medições de tempo:

public class CalculadoraDecorator : ICalculadora
{
    private readonly ICalculadora _calculadora;
    public CalculadoraDecorator(ICalculadora calculadora)
    {
        _calculadora = calculadora;
    }
    public async Task<int> SomarAsync(int a, int b)
    {
        var stopwatch = System.Diagnostics.Stopwatch.StartNew();
        int resultado = await _calculadora.SomarAsync(a, b);
        stopwatch.Stop();
        Console.WriteLine($"[Decorator] SomarAsync levou {stopwatch.ElapsedMilliseconds}ms.");
        return resultado;
    }
    public async Task<int> MultiplicarAsync(int a, int b)
    {
        var stopwatch = System.Diagnostics.Stopwatch.StartNew();
        int resultado = await _calculadora.MultiplicarAsync(a, b);
        stopwatch.Stop();
        Console.WriteLine($"[Decorator] MultiplicarAsync levou {stopwatch.ElapsedMilliseconds}ms.");
        return resultado;
    }
}

O que está acontecendo aqui?

Utilizando o Decorator na Prática

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! usar nosso Decorator Assíncrono⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais., basta instanciar a 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. decoradora, passando a implementação real como parâmetro:

public class Program
{
    public static async Task Main()
    {
        // Cria a instância concreta
        ICalculadora calcReal = new CalculadoraConcreta();
        // Cria o decorator que envolve a instância real
        ICalculadora calcDecorada = new CalculadoraDecorator(calcReal);
        // Usa normalmente, mas agora com interceptação
        int soma = await calcDecorada.SomarAsync(5, 3);
        Console.WriteLine($"Resultado da Soma: {soma}");
        int produto = await calcDecorada.MultiplicarAsync(4, 6);
        Console.WriteLine($"Resultado da Multiplicação: {produto}");
    }
}

Quando você executar🔍 Comandos: Desacople Ações dos Botões!🔍 Comandos: Desacople Ações dos Botões!Aprenda a implementar comandos em C# para desacoplar lógica e interface usando MVVM, com exemplos práticos e dicas para melhor testabilidade e manutenção. este código, observará:

Vantagens do Decorator Assíncrono🔗

Conclusão🔗

O Decorator Assíncrono⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais. é especialmente útil em cenários📊 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. onde diversas operações necessitam de comportamentos adicionais, como logs, medição de desempenho ou verificaçãoComo Assegurar Validação e Cobertura de Código em Projetos LINQComo Assegurar Validação e Cobertura de Código em Projetos LINQAprenda estratégias avançadas para testar consultas LINQ, garantindo cobertura de código e confiabilidade com ferramentas e práticas recomendadas. de políticas. Com ele, você pode manter o foco no código principal 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. ainda interceptar chamadas assíncronas de maneira elegante, seguindo de perto os princípios de design limpo e boas práticas🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!🔢 Operadores Aritméticos: Faça Cálculos como uma Calculadora Humana!Aprenda a dominar operadores aritméticos em C# com exemplos práticos, técnicas de cálculo e dicas para evitar erros e maximizar resultados. de código.

Ao aplicar esse padrão, lembre-se de que cada Decorator deve respeitar os contratos (interfaces📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas.) definidos e propagar corretamente os cenários📊 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. await/asyncAplicações Desktop Assíncronas com WPF e WinFormsAplicações Desktop Assíncronas com WPF e WinFormsDescubra como utilizar async/await em desktop com WPF e WinForms para manter a UI fluida, evitando travamentos e melhorando a experiência do usuário., para que o fluxo continue claro para quem usa suas classes. Dessa forma, você obtém um modelo escalável📡 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., fácil de manter e, principalmente, sem dor de cabeça em meio ao mundo do Async/Await⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais..

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