Sobes.tech
Middle+

¿Cómo se puede realizar una acción antes y después del procesamiento de la solicitud sin usar un intermediario (middleware)?

sobes.tech AI

Respuesta de la IA

Utilizando programación orientada a aspectos con interceptores, por ejemplo, con la biblioteca Castle Windsor o AspectCore.

// Ejemplo de interfaz para un servicio
public interface IService
{
    void DoSomething(string input);
}
using Castle.DynamicProxy;

// Interceptor para registro
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        // Acción antes del procesamiento
        Console.WriteLine($"Inicio de llamada al método: {invocation.Method.Name}");

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

            // Acción después del procesamiento exitoso
            Console.WriteLine($"Método {invocation.Method.Name} ejecutado con éxito.");
        }
        catch (Exception ex)
        {
            // Acción en caso de error
            Console.WriteLine($"Error en la llamada al método {invocation.Method.Name}: {ex.Message}");
            throw; // Re-lanzar la excepción
        }
    }
}
// Ejemplo de implementación del servicio
public class MyService : IService
{
    public void DoSomething(string input)
    {
        Console.WriteLine($"Realizando acción con el parámetro: {input}");
        // Simulación de error
        // if (input == "error") throw new InvalidOperationException("Algo salió mal");
    }
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;

// Registro del servicio y del interceptor en el contenedor 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>());

        // Obtener la instancia proxy del servicio
        var service = container.Resolve<IService>();

        service.DoSomething("prueba");
        // service.DoSomething("error"); // Descomentar para probar manejo de errores

        container.Dispose();
    }
}

También se puede usar:

  • Decorador (Patrón de diseño Decorator): Crear un envoltorio alrededor de la clase original que realiza acciones antes y después de llamar a los métodos de la clase original.
  • Incrustación de código (Code weaving): Modificar el bytecode del ensamblado en la etapa de compilación o carga, usando herramientas como PostSharp.