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.