Middle+
Kā veikt darbību pirms un pēc pieprasījuma apstrādes, neizmantojot middleware?
sobes.tech AI
Atbilde no AI
Izmantojot aspektu orientētu programmēšanu ar interceptoriem, piemēram, ar Castle Windsor vai AspectCore bibliotēkām.
// Piemēra interfeiss pakalpojumam
public interface IService
{
void DoSomething(string input);
}
using Castle.DynamicProxy;
// Intercepts žurnālam
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// Darbība pirms pieprasījuma apstrādes
Console.WriteLine($"Metodes izsaukuma sākums: {invocation.Method.Name}");
try
{
// Oriģinālās metodes izpilde
invocation.Proceed();
// Darbība pēc veiksmīgas apstrādes
Console.WriteLine($"Metode {invocation.Method.Name} veiksmīgi izpildīta.");
}
catch (Exception ex)
{
// Darbība pēc kļūdas
Console.WriteLine($"Kļūda, izsaucot metodi {invocation.Method.Name}: {ex.Message}");
throw; // Pārliek izņēmumu
}
}
}
// Pakalpojuma realizācijas piemērs
public class MyService : IService
{
public void DoSomething(string input)
{
Console.WriteLine($"Veic darbību ar parametru: {input}");
// Kļūdas imitācija
// if (input == "kļūda") throw new InvalidOperationException("Kas notika nepareizi");
}
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;
// Pakalpojuma un interceptora reģistrācija IoC konteinerā
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>());
// Saņem proxy pakalpojuma instanci
var service = container.Resolve<IService>();
service.DoSomething("tests");
// service.DoSomething("kļūda"); // Kļūdu pārbaude
container.Dispose();
}
}
Tāpat var izmantot:
- Dekorators (Decorator design pattern): Izveidot apvalku ap oriģinālo klasi, kas veic darbības pirms un pēc oriģinālās klases metožu izsaukšanas.
- Koda audums (Code weaving): Modificēt baitkodu kompilācijas vai ielādes laikā, izmantojot rīkus kā PostSharp.