Middle+
Come eseguire un'azione prima e dopo l'elaborazione della richiesta senza usare middleware?
sobes.tech AI
Risposta dell'AI
Utilizzando la programmazione orientata agli aspetti con intercettori, ad esempio con la libreria Castle Windsor o AspectCore.
// Esempio di interfaccia per un servizio
public interface IService
{
void DoSomething(string input);
}
using Castle.DynamicProxy;
// Interceptor per il logging
public class LoggingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// Azione prima dell'elaborazione
Console.WriteLine($"Inizio chiamata metodo: {invocation.Method.Name}");
try
{
// Eseguire il metodo originale
invocation.Proceed();
// Azione dopo elaborazione riuscita
Console.WriteLine($"Metodo {invocation.Method.Name} eseguito con successo.");
}
catch (Exception ex)
{
// Azione in caso di errore
Console.WriteLine($"Errore durante la chiamata del metodo {invocation.Method.Name}: {ex.Message}");
throw; // Rilancia l'eccezione
}
}
}
// Esempio di implementazione del servizio
public class MyService : IService
{
public void DoSomething(string input)
{
Console.WriteLine($"Esecuzione azione con parametro: {input}");
// Simulazione di errore
// if (input == "errore") throw new InvalidOperationException("Qualcosa è andato storto");
}
}
using Castle.MicroKernel.Registration;
using Castle.Windsor;
// Registrazione del servizio e dell'interceptor nel contenitore IoC
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>());
// Ottenere l'istanza proxy del servizio
var service = container.Resolve<IService>();
service.DoSomething("test");
// service.DoSomething("errore"); // Disattivare per testare la gestione degli errori
container.Dispose();
}
}
Può anche essere usato:
- Decoratore (Design Pattern Decorator): Creare un wrapper attorno alla classe originale che esegue azioni prima e dopo la chiamata ai metodi della classe originale.
- Code weaving: Modificare il bytecode dell'assembly durante la compilazione o il caricamento, usando strumenti come PostSharp.