Sobes.tech
Middle+

Como realizar uma ação antes e depois do processamento da solicitação sem usar um middleware?

sobes.tech IA

Resposta da IA

Utilizando programação orientada a aspetos com interceptores, por exemplo, com a biblioteca Castle Windsor ou AspectCore.

// Exemplo de interface para um serviço
public interface IService
{
    void DoSomething(string input);
}
using Castle.DynamicProxy;

// Interceptor para logging
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        // Ação antes do processamento
        Console.WriteLine($"Início da chamada do método: {invocation.Method.Name}");

        try
        {
            // Executar método original
            invocation.Proceed();

            // Ação após processamento bem-sucedido
            Console.WriteLine($"Método {invocation.Method.Name} executado com sucesso.");
        }
        catch (Exception ex)
        {
            // Ação em caso de erro
            Console.WriteLine($"Erro na chamada do método {invocation.Method.Name}: {ex.Message}");
            throw; // Re-levantar exceção
        }
    }
}
// Exemplo de implementação do serviço
public class MyService : IService
{
    public void DoSomething(string input)
    {
        Console.WriteLine($"A executar ação com o parâmetro: {input}");
        // Simulação de erro
        // if (input == "erro") throw new InvalidOperationException("Algo correu mal");
    }
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;

// Registo do serviço e do interceptor no contêiner IoC
public class Program
{
    public static void Main(string[] args)
    {
        var container = new WindsorContainer();

        container.Register(Component.For<LoggingInterceptor>());
        container.Register(Component.For<IService>().ImplementedBy<MyService>().Interceptors<LoggingInterceptor>());

        // Obter a instância proxy do serviço
        var service = container.Resolve<IService>();

        service.DoSomething("teste");
        // service.DoSomething("erro"); // Descomentar para testar o tratamento de erros

        container.Dispose();
    }
}

Também pode usar:

  • Decorador (padrão de design Decorator): Criar um wrapper em torno da classe original que realiza ações antes e depois de chamar os métodos da classe original.
  • Code weaving: Modificar o bytecode do assembly na fase de compilação ou carregamento, usando ferramentas como PostSharp.