DEV Community

Luciano Azevedo
Luciano Azevedo

Posted on

Adapter Pattern em C# com Injeção de Dependência e Worker Service

🚀 Aplicando o Adapter Pattern em C# com Injeção de Dependência e Worker Service

📌 Introdução

Ao trabalhar com sistemas legados, é comum encontrar APIs ou serviços que não seguem as interfaces modernas do nosso código. Em vez de modificar diretamente esses sistemas, podemos usar o Adapter Pattern para fazer a integração de forma elegante.

Neste artigo, vou mostrar como implementar o Adapter Pattern em C#, usando Injeção de Dependência (DI) e um Worker Service para simular um processo contínuo.


🎯 O que é o Adapter Pattern?

O Adapter Pattern é um padrão estrutural que permite que objetos com interfaces incompatíveis trabalhem juntos. Ele age como um intermediário, convertendo a interface de uma classe para outra esperada pelo sistema.

📌 Quando usar?

✅ Quando precisamos integrar APIs ou bibliotecas legadas que não podem ser alteradas.
✅ Quando queremos manter um código desacoplado e flexível.
✅ Quando temos diferentes implementações que precisam seguir um mesmo contrato.


🛠️ Implementação

Vamos construir um exemplo onde temos um sistema de pagamentos legados e queremos integrá-lo a um Worker Service que processa pagamentos periodicamente.

🏗️ 1️⃣ Criamos a interface moderna IPaymentProcessor

public interface IPaymentProcessor
{
    void ProcessPayment(decimal amount);
}
Enter fullscreen mode Exit fullscreen mode

🏗️ 2️⃣ Criamos o serviço legado LegacyPaymentService

Este é um serviço que já existe e que queremos reutilizar, mas ele usa uma interface diferente.

public sealed class LegacyPaymentService
{
    public void MakePayment(string amount)
    {
        Console.WriteLine($"Processing payment of {amount} via legacy system.");
    }
}
Enter fullscreen mode Exit fullscreen mode

🏗️ 3️⃣ Criamos o Adapter PaymentAdapter

Aqui adaptamos LegacyPaymentService para seguir a interface IPaymentProcessor.

public sealed class PaymentAdapter : IPaymentProcessor
{
    private readonly LegacyPaymentService _legacyPaymentService;

    public PaymentAdapter(LegacyPaymentService legacyPaymentService)
    {
        _legacyPaymentService = legacyPaymentService;
    }

    public void ProcessPayment(decimal amount)
    {
        string amountString = amount.ToString("F2");
        _legacyPaymentService.MakePayment(amountString);
    }
}
Enter fullscreen mode Exit fullscreen mode

🏗️ 4️⃣ Criamos o Worker Service PaymentWorker

Nosso Worker será responsável por chamar o IPaymentProcessor periodicamente.

using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;

public class PaymentWorker : BackgroundService
{
    private readonly ILogger<PaymentWorker> _logger;
    private readonly IPaymentProcessor _paymentProcessor;

    public PaymentWorker(ILogger<PaymentWorker> logger, IPaymentProcessor paymentProcessor)
    {
        _logger = logger;
        _paymentProcessor = paymentProcessor;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Iniciando processamento de pagamento...");

            _paymentProcessor.ProcessPayment(100.50m); // Simulando pagamento de R$100,50

            _logger.LogInformation("Pagamento processado com sucesso!");

            await Task.Delay(5000, stoppingToken); // Executa a cada 5 segundos
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

🏗️ 5️⃣ Configuramos a Injeção de Dependência no Host

Agora precisamos configurar os serviços no Host do Worker Service.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

class Program
{
    static void Main(string[] args)
    {
        var host = Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddSingleton<LegacyPaymentService>(); // Serviço legado
                services.AddSingleton<IPaymentProcessor, PaymentAdapter>(); // Adapter
                services.AddHostedService<PaymentWorker>(); // Worker Service
                services.AddLogging(); // Logs
            })
            .Build();

        host.Run();
    }
}
Enter fullscreen mode Exit fullscreen mode

✅ O que aprendemos?

✔ Como usar o Adapter Pattern para conectar serviços legados a um código moderno.
✔ Como estruturar Injeção de Dependência (DI) para desacoplar o código.
✔ Como criar um Worker Service que processa tarefas periodicamente.


🚀 Conclusão

O Adapter Pattern é uma solução poderosa para integrar serviços sem alterar o código legado. Combinado com Injeção de Dependência e Worker Services, ele nos permite construir sistemas escaláveis e bem estruturados.

E você? Já usou esse padrão em algum projeto? Deixe um comentário! 🚀

Top comments (0)