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.