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 container
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>());

        // Απόκτηση της διαμεσολαβημένης (proxied) υπηρεσίας
        var service = container.Resolve<IService>();

        service.DoSomething("δοκιμή");
        // service.DoSomething("σφάλμα"); // Απενεργοποιήστε για δοκιμή διαχείρισης σφαλμάτων

        container.Dispose();
    }
}

Επίσης, μπορεί να χρησιμοποιηθεί:

  • Decorator (σχεδιαστικό μοτίβο Decorator): Δημιουργία ενός περιτυλίγματος γύρω από την αρχική κλάση, που εκτελεί ενέργειες πριν και μετά την κλήση των μεθόδων της αρχικής κλάσης.
  • Code weaving: Τροποποίηση του bytecode του assembly κατά τη φάση της μεταγλώττισης ή φόρτωσης, χρησιμοποιώντας εργαλεία όπως το PostSharp.