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.