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.