Sobes.tech
Middle+

Kako izvršiti radnju pre i posle obrade zahteva bez korišćenja middleware-a?

sobes.tech АИ

Одговор од АИ

Користећи аспектно-оријентисано програмирање са интерцепторима, на пример, помоћу библиотеке 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 design pattern): Направити омотач око оригиналне класе која извршава акције пре и после позива метода оригиналне класе.
  • Уграђивање кода (Code weaving): Модификовати байт-код збира на нивоу компилације или учитавања, користећи алате типа PostSharp.