Sobes.tech
Middle+

Hogyan lehet végrehajtani egy műveletet a kérés feldolgozása előtt és után middleware (köztes réteg) használata nélkül?

sobes.tech MI

Válasz az MI-től

Aspektus-orientált programozás interceptorsokkal, például a Castle Windsor vagy AspectCore könyvtárak segítségével.

// Szolgáltatás interfész példája
public interface IService
{
    void DoSomething(string input);
}
using Castle.DynamicProxy;

// Naplózó interceptor
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        // Művelet a kérés előtt
        Console.WriteLine($"Metódushívás kezdete: {invocation.Method.Name}");

        try
        {
            // Eredeti metódus végrehajtása
            invocation.Proceed();

            // Művelet sikeres feldolgozás után
            Console.WriteLine($"A {invocation.Method.Name} metódus sikeresen végrehajtódott.");
        }
        catch (Exception ex)
        {
            // Hiba esetén
            Console.WriteLine($"Hiba a {invocation.Method.Name} metódus hívásakor: {ex.Message}");
            throw; // Kivétel újra dobása
        }
    }
}
// Szolgáltatás implementáció példája
public class MyService : IService
{
    public void DoSomething(string input)
    {
        Console.WriteLine($"Művelet végrehajtása a paraméterrel: {input}");
        // Hiba szimulálása
        // if (input == "hiba") throw new InvalidOperationException("Valami rosszul ment");
    }
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;

// Szolgáltatás és interceptor regisztrálása IoC konténerben
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>());

        // Proxy példány beszerzése
        var service = container.Resolve<IService>();

        service.DoSomething("teszt");
        // service.DoSomething("hiba"); // Hibakezelés tesztelése

        container.Dispose();
    }
}

Szintén használható:

  • Decorator (tervezési minta Decorator): Egy wrapper létrehozása az eredeti osztály körül, amely az eredeti osztály metódusainak hívása előtt és után is végrehajt műveleteket.
  • Code weaving: Az assembly bytecode-jának módosítása fordítás vagy betöltés során, például PostSharp eszközökkel.