Middle+
Kaip galima atlikti veiksmą prieš ir po užklausos apdorojimo, nenaudojant middleware?
sobes.tech AI
Atsakymas iš AI
Naudojant aspektų orientuotą programavimą su interceptoriais, pavyzdžiui, naudojant Castle Windsor arba AspectCore bibliotekas.
// Pavyzdinis interfeisas paslaugai
public interface IService
{
void DoSomething(string input);
}
using Castle.DynamicProxy;
// Interceptoris žurnalavimui
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// Veiksmas prieš užklausos apdorojimą
Console.WriteLine($"Metodo iškvietimo pradžia: {invocation.Method.Name}");
try
{
// Originalaus metodo vykdymas
invocation.Proceed();
// Veiksmas po sėkmingo apdorojimo
Console.WriteLine($"Metodo {invocation.Method.Name} sėkmingai įvykdyta.");
}
catch (Exception ex)
{
// Veiksmas po klaidos
Console.WriteLine($"Klaida metodo {invocation.Method.Name} iškvietimo metu: {ex.Message}");
throw; // Pakartotinai išmetame išimtį
}
}
}
// Paslaugos įgyvendinimo pavyzdys
public class MyService : IService
{
public void DoSomething(string input)
{
Console.WriteLine($"Veiksmas su parametru: {input}");
// Klaidos imitacija
// if (input == "klaida") throw new InvalidOperationException("Kažkas nepavyko");
}
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;
// Paslaugos ir interceptor registracija IoC konteineryje
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>());
// Gauti proxy paslaugos egzempliorių
var service = container.Resolve<IService>();
service.DoSomething("testas");
// service.DoSomething("klaida"); // Patikrinimui klaidų
container.Dispose();
}
}
Taip pat galima naudoti:
- Dekoratorius (Decorator design pattern): Sukurti apvalkalą aplink originalią klasę, kuri atlieka veiksmus prieš ir po originalios klasės metodų iškvietimo.
- Kodo audimas (Code weaving): Modifikuoti baitkodo kodą kompiliacijos ar įkėlimo metu, naudojant įrankius kaip PostSharp.