Middle+
Kuidas teha toimingut enne ja pärast päringu töötlemist ilma middleware kasutamata?
sobes.tech AI
Vastus AI-lt
Kasutades aspektipõhist programmeerimist interceptors'itega, näiteks Castle Windsor või AspectCore teekide abil.
// Näide teenuse liidesest
public interface IService
{
void DoSomething(string input);
}
using Castle.DynamicProxy;
// Interceptor logimiseks
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// Tegevus enne päringu töötlemist
Console.WriteLine($"Meetodi kutsumise algus: {invocation.Method.Name}");
try
{
// Põhimeetodi täitmine
invocation.Proceed();
// Tegevus pärast edukat töötlemist
Console.WriteLine($"Meetod {invocation.Method.Name} edukalt täidetud.");
}
catch (Exception ex)
{
// Tegevus vea korral
Console.WriteLine($"Viga meetodi {invocation.Method.Name} kutsumisel: {ex.Message}");
throw; // Välja viskame uuesti vea
}
}
}
// Näide teenuse rakendamisest
public class MyService : IService
{
public void DoSomething(string input)
{
Console.WriteLine($"Tegevus parameetriga: {input}");
// Vea simuleerimine
// if (input == "viga") throw new InvalidOperationException("Midagi läks valesti");
}
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;
// Teenuse ja interceptori registreerimine IoC konteineris
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 eksemplari saamine
var service = container.Resolve<IService>();
service.DoSomething("test");
// service.DoSomething("viga"); // Vigade kontrollimiseks
container.Dispose();
}
}
Samuti saab kasutada:
- Dekorator (Decorator design pattern): Luua ümbris algklassile, mis teostab tegevusi enne ja pärast algse klassi meetodite väljakutset.
- Koodi kudumine (Code weaving): Muuta baitkoodi kompileerimise või laadimise ajal, kasutades tööriistu nagu PostSharp.