Sobes.tech
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 տեսակի գործիքներ։