Sobes.tech
Middle+

Ako je mogoče vykonať akciu pred a po spracovaní požiadavky bez použitia middleware?

sobes.tech AI

Odpoveď od AI

Používajte aspektovo orientované programovanie s interceptormi, napríklad pomocou knižnice Castle Windsor alebo AspectCore.

// Príklad rozhrania pre službu
public interface IService
{
    void DoSomething(string input);
}
using Castle.DynamicProxy;

// Interceptor pre logovanie
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        // Akcia pred spracovaním požiadavky
        Console.WriteLine($"Začiatok volania metódy: {invocation.Method.Name}");

        try
        {
            // Vykonanie pôvodnej metódy
            invocation.Proceed();

            // Akcia po úspešnom spracovaní požiadavky
            Console.WriteLine($"Metóda {invocation.Method.Name} úspešne vykonaná.");
        }
        catch (Exception ex)
        {
            // Akcia po chybe
            Console.WriteLine($"Chyba pri volaní metódy {invocation.Method.Name}: {ex.Message}");
            throw; // Znova vyhodiť výnimku
        }
    }
}
// Príklad implementácie služby
public class MyService : IService
{
    public void DoSomething(string input)
    {
        Console.WriteLine($"Prebieha akcia s parametrom: {input}");
        // Napodobnenie chyby
        // if (input == "chyba") throw new InvalidOperationException("Niečo sa pokazilo");
    }
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;

// Registrácia služby a interceptora v IoC kontajneri
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>());

        // Získanie proxy instance služby
        var service = container.Resolve<IService>();

        service.DoSomething("test");
        // service.DoSomething("chyba"); // Odkomentovať pre testovanie chýb

        container.Dispose();
    }
}

Tiež je možné použiť:

  • Dekorátor (Decorator design pattern): Vytvoriť obal okolo pôvodnej triedy, ktorá vykonáva akcie pred a po volaní metód pôvodnej triedy.
  • Vloženie kódu (Code weaving): Modifikovať bytecode kompilácie na úrovni kompilácie alebo načítania pomocou nástrojov typu PostSharp.