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): Баштапкы класстын тегерегине каптоо түзүү, ал метод чакырууларын алдын ала жана кийин иштетет.
  • Кодду тегиздөө (Code weaving): Байткодду компиляция же жүктөө учурунда өзгөртүү, мисалы, PostSharp сыяктуу инструменттерди колдонуу.