Sobes.tech
Middle+

Kaip galima atlikti veiksmą prieš ir po užklausos apdorojimo, nenaudojant middleware?

sobes.tech AI

Atsakymas iš AI

Naudojant aspektų orientuotą programavimą su interceptoriais, pavyzdžiui, naudojant Castle Windsor arba AspectCore bibliotekas.

// Pavyzdinis interfeisas paslaugai
public interface IService
{
    void DoSomething(string input);
}
using Castle.DynamicProxy;

// Interceptoris žurnalavimui
public class LoggingInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        // Veiksmas prieš užklausos apdorojimą
        Console.WriteLine($"Metodo iškvietimo pradžia: {invocation.Method.Name}");

        try
        {
            // Originalaus metodo vykdymas
            invocation.Proceed();

            // Veiksmas po sėkmingo apdorojimo
            Console.WriteLine($"Metodo {invocation.Method.Name} sėkmingai įvykdyta.");
        }
        catch (Exception ex)
        {
            // Veiksmas po klaidos
            Console.WriteLine($"Klaida metodo {invocation.Method.Name} iškvietimo metu: {ex.Message}");
            throw; // Pakartotinai išmetame išimtį
        }
    }
}
// Paslaugos įgyvendinimo pavyzdys
public class MyService : IService
{
    public void DoSomething(string input)
    {
        Console.WriteLine($"Veiksmas su parametru: {input}");
        // Klaidos imitacija
        // if (input == "klaida") throw new InvalidOperationException("Kažkas nepavyko");
    }
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;

// Paslaugos ir interceptor registracija IoC konteineryje
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>());

        // Gauti proxy paslaugos egzempliorių
        var service = container.Resolve<IService>();

        service.DoSomething("testas");
        // service.DoSomething("klaida"); // Patikrinimui klaidų

        container.Dispose();
    }
}

Taip pat galima naudoti:

  • Dekoratorius (Decorator design pattern): Sukurti apvalkalą aplink originalią klasę, kuri atlieka veiksmus prieš ir po originalios klasės metodų iškvietimo.
  • Kodo audimas (Code weaving): Modifikuoti baitkodo kodą kompiliacijos ar įkėlimo metu, naudojant įrankius kaip PostSharp.