Sobes.tech
Middle+

Kā veikt darbību pirms un pēc pieprasījuma apstrādes, neizmantojot middleware?

sobes.tech AI

Atbilde no AI

Izmantojot aspektu orientētu programmēšanu ar interceptoriem, piemēram, ar Castle Windsor vai AspectCore bibliotēkām.

// Piemēra interfeiss pakalpojumam
public interface IService
{
    void DoSomething(string input);
}
using Castle.DynamicProxy;

// Intercepts žurnālam
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        // Darbība pirms pieprasījuma apstrādes
        Console.WriteLine($"Metodes izsaukuma sākums: {invocation.Method.Name}");

        try
        {
            // Oriģinālās metodes izpilde
            invocation.Proceed();

            // Darbība pēc veiksmīgas apstrādes
            Console.WriteLine($"Metode {invocation.Method.Name} veiksmīgi izpildīta.");
        }
        catch (Exception ex)
        {
            // Darbība pēc kļūdas
            Console.WriteLine($"Kļūda, izsaucot metodi {invocation.Method.Name}: {ex.Message}");
            throw; // Pārliek izņēmumu
        }
    }
}
// Pakalpojuma realizācijas piemērs
public class MyService : IService
{
    public void DoSomething(string input)
    {
        Console.WriteLine($"Veic darbību ar parametru: {input}");
        // Kļūdas imitācija
        // if (input == "kļūda") throw new InvalidOperationException("Kas notika nepareizi");
    }
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;

// Pakalpojuma un interceptora reģistrācija IoC konteinerā
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>());

        // Saņem proxy pakalpojuma instanci
        var service = container.Resolve<IService>();

        service.DoSomething("tests");
        // service.DoSomething("kļūda"); // Kļūdu pārbaude

        container.Dispose();
    }
}

Tāpat var izmantot:

  • Dekorators (Decorator design pattern): Izveidot apvalku ap oriģinālo klasi, kas veic darbības pirms un pēc oriģinālās klases metožu izsaukšanas.
  • Koda audums (Code weaving): Modificēt baitkodu kompilācijas vai ielādes laikā, izmantojot rīkus kā PostSharp.