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.