Middle+
როგორ შეიძლება განხორციელდეს მოქმედება მოთხოვნის დამუშავების წინ და შემდეგ, შუამავლი (middleware) გამოყენების გარეშე?
sobes.tech AI
პასუხი AI-სგან
Աспեկտային-կողմնորոշված ծրագրավորման և միջամտիչների (interceptors) օգտագործում, օրինակ, 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): Ստեղծել օղակ՝ սկզբնական դասի շուրջ, որը կատարում է գործողություններ սկզբում և վերջում սկզբնական դասի մեթոդների կանչի
- Կոդի weaving (Code weaving): Մոդիֆիկացնել բայթ-կոդը կոմպիլյացիայի կամ բեռնումի փուլում, օգտագործելով PostSharp տեսակի գործիքներ։