Nello script #560 abbiamo visto come sfruttare gli eventi pubblicati durante l'esecuzione del metodo SaveChanges. Lo svantaggio degli eventi è che ogni volta dobbiamo sottoscriverci agli eventi per eseguire lanostra logica. Questo può essere fatto sruttando una factory che crea il contesto e sottoscrive gli eventi, ma il codice non è sempre semplice e a volte non abbiamo nemmeno controllo sull'istanziazione del contesto. In questi casi possiamo creare un interceptor.
Come abbiamo già avuto modo di vedere nello script #546, un interceptor è un oggetto che si registra nella pipeline di Entity Framework Core e i cui metodi vengono invocati quando si verificano determinate azioni. Nel nostro caso, possiamo creare un SaveChanges interceptor che viene invocato all'inizio, alla fine e in caso di errore nel metodo SaveChanges. Un interceptor è una classe che implementa l'interfaccia ISaveChangesInterceptor o che eredita da SaveChangesInterceptor (che a sua volta implementa l'interfaccia).
class MySaveChangesInterceptor : SaveChangesInterceptor { public override InterceptionResult<int> SavingChanges(DbContextEventData eventData, InterceptionResult<int> result) { return base.SavingChanges(eventData, result); } public override void SaveChangesFailed(DbContextErrorEventData eventData) { base.SaveChangesFailed(eventData); } public override int SavedChanges(SaveChangesCompletedEventData eventData, int result) { return base.SavedChanges(eventData, result); } }
Il parametro eventData espone la proprietà Context di tipo DbContext che da accesso al contesto. Se volessimo eseguire il logging delle entity persistite, nel metodo SavingChanges potremmo recuperare le istanze degli oggetti in stato diverso da Unchanged e creare un oggetto che viene poi loggato nel metodo SavedChanges o scartato nel metodo SaveChangesFailed all'interno del quale invece logghiamo l'errore disponibile tramite la proprietà Exception di eventData.
Per aggiungere l'interceptor ala pipeline di Entity Framework Core, dobbiamo invocare il metodo AddInterceptor in fase di configurazione passando in input un'istanza dell'interceptor.
public class MyContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.AddInterceptors(new MySaveChangesInterceptor ()); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sostituire la GitHub Action di login su private registry
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Evitare il flickering dei componenti nel prerender di Blazor 8
Ottimizzazione dei block template in Angular 17
Eseguire una query su SQL Azure tramite un workflow di GitHub
Code scanning e advanced security con Azure DevOps
Utilizzare Tailwind CSS all'interno di React: primi componenti
Usare una container image come runner di GitHub Actions
Le novità di Angular: i miglioramenti alla CLI
Visualizzare le change sul plan di Terraform tramite le GitHub Actions
Reactive form tipizzati con FormBuilder in Angular
Supportare il sorting di dati tabellari in Blazor con QuickGrid
I più letti di oggi
- Impostare un elemento come ridimensionabile tramite CSS
- Proteggersi dagli attacchi di Open Redirect in ASP.NET Core MVC
- Personalizzare l'errore del rate limiting middleware in ASP.NET Core
- Accedere alla console di una Azure Container App
- Modificare i metadati nell'head dell'HTML di una Blazor Web App
- Gli oggetti CallOut di Expression Blend 4.0
- SQL Server 2005 December CTP
- Sfruttare le nuove tipologie di input di HTML5 con ASP.NET 4.0
- Upload da una pagina web con Dundas Upload