Sobes.tech
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.