Middle+
Как може да се изпълни действие преди и след обработката на заявката, без да се използва middleware?
sobes.tech AI
Отговор от AI
Използване на аспектно-ориентирано програмиране с интерцептори, например с помощта на библиотеката Castle Windsor или AspectCore.
// Пример за интерфейс за услуга
public interface IService
{
void DoSomething(string input);
}
using Castle.DynamicProxy;
// Интерцептор за логване
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// Действие преди обработката
Console.WriteLine($"Начало на извикване на метода: {invocation.Method.Name}");
try
{
// Изпълнение на оригиналния метод
invocation.Proceed();
// Действие след успешно изпълнение
Console.WriteLine($"Метод {invocation.Method.Name} е изпълнен успешно.");
}
catch (Exception ex)
{
// Действие при грешка
Console.WriteLine($"Грешка при извикване на метода {invocation.Method.Name}: {ex.Message}");
throw; // Повторно хвърляне на изключението
}
}
}
// Пример за реализация на услуга
public class MyService : IService
{
public void DoSomething(string input)
{
Console.WriteLine($"Изпълнение на действие с параметър: {input}");
// Имитация на грешка
// if (input == "грешка") throw new InvalidOperationException("Нещо се обърка");
}
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;
// Регистрация на услуга и интерцептор в IoC контейнера
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>());
// Получаване на прокси инстанция на услугата
var service = container.Resolve<IService>();
service.DoSomething("тест");
// service.DoSomething("грешка"); // Изключете за тестване на обработка на грешки
container.Dispose();
}
}
Може също да се използва:
- Декоратор (дизайнерски шаблон Decorator): Създаване на обвивка около оригиналния клас, която изпълнява действия преди и след извикването на методите на оригиналния клас.
- Code weaving: Модифициране на байткода на асемблито по време на компилация или зареждане, използвайки инструменти като PostSharp.