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.