Sobes.tech
Middle+

Jak lze provést akci před a po zpracování požadavku bez použití middleware?

sobes.tech AI

Odpověď od AI

Použití aspektově orientovaného programování s interceptory, například pomocí knihovny Castle Windsor nebo AspectCore.

// Příklad rozhraní pro službu
public interface IService
{
    void DoSomething(string input);
}
using Castle.DynamicProxy;

// Interceptor pro logování
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        // Akce před zpracováním
        Console.WriteLine($"Začátek volání metody: {invocation.Method.Name}");

        try
        {
            // Spuštění původní metody
            invocation.Proceed();

            // Akce po úspěšném zpracování
            Console.WriteLine($"Metoda {invocation.Method.Name} úspěšně provedena.");
        }
        catch (Exception ex)
        {
            // Akce při chybě
            Console.WriteLine($"Chyba při volání metody {invocation.Method.Name}: {ex.Message}");
            throw; // Přeposlání výjimky
        }
    }
}
// Příklad implementace služby
public class MyService : IService
{
    public void DoSomething(string input)
    {
        Console.WriteLine($"Provádí se akce s parametrem: {input}");
        // Simulace chyby
        // if (input == "chyba") throw new InvalidOperationException("Něco se pokazilo");
    }
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;

// Registrace služby a interceptora v IoC kontejneru
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ískání proxy instance služby
        var service = container.Resolve<IService>();

        service.DoSomething("test");
        // service.DoSomething("chyba"); // Odkomentovat pro testování zpracování chyb

        container.Dispose();
    }
}

Také lze použít:

  • Decorator (design pattern Decorator): Vytvořit obal kolem původní třídy, který provádí akce před a po volání metod původní třídy.
  • Code weaving: Modifikace bytecode sestavy při kompilaci nebo načítání, například pomocí nástrojů jako PostSharp.