Sobes.tech
Middle+

Kuidas teha toimingut enne ja pärast päringu töötlemist ilma middleware kasutamata?

sobes.tech AI

Vastus AI-lt

Kasutades aspektipõhist programmeerimist interceptors'itega, näiteks Castle Windsor või AspectCore teekide abil.

// Näide teenuse liidesest
public interface IService
{
    void DoSomething(string input);
}
using Castle.DynamicProxy;

// Interceptor logimiseks
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        // Tegevus enne päringu töötlemist
        Console.WriteLine($"Meetodi kutsumise algus: {invocation.Method.Name}");

        try
        {
            // Põhimeetodi täitmine
            invocation.Proceed();

            // Tegevus pärast edukat töötlemist
            Console.WriteLine($"Meetod {invocation.Method.Name} edukalt täidetud.");
        }
        catch (Exception ex)
        {
            // Tegevus vea korral
            Console.WriteLine($"Viga meetodi {invocation.Method.Name} kutsumisel: {ex.Message}");
            throw; // Välja viskame uuesti vea
        }
    }
}
// Näide teenuse rakendamisest
public class MyService : IService
{
    public void DoSomething(string input)
    {
        Console.WriteLine($"Tegevus parameetriga: {input}");
        // Vea simuleerimine
        // if (input == "viga") throw new InvalidOperationException("Midagi läks valesti");
    }
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;

// Teenuse ja interceptori registreerimine IoC konteineris
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>());

        // Proxy eksemplari saamine
        var service = container.Resolve<IService>();

        service.DoSomething("test");
        // service.DoSomething("viga"); // Vigade kontrollimiseks

        container.Dispose();
    }
}

Samuti saab kasutada:

  • Dekorator (Decorator design pattern): Luua ümbris algklassile, mis teostab tegevusi enne ja pärast algse klassi meetodite väljakutset.
  • Koodi kudumine (Code weaving): Muuta baitkoodi kompileerimise või laadimise ajal, kasutades tööriistu nagu PostSharp.