Entity Framework - Intercettazione dei comandi
In Entity Framework 6.0 è disponibile un'altra nuova funzionalità nota come Interceptoro intercettazione. Il codice di intercettazione si basa sul concetto diinterception interfaces. Ad esempio, l'interfaccia IDbCommandInterceptor definisce i metodi che vengono chiamati prima che EF esegua una chiamata a ExecuteNonQuery, ExecuteScalar, ExecuteReader e ai metodi correlati.
Entity Framework può davvero brillare usando l'intercettazione. Utilizzando questo approccio è possibile acquisire molte più informazioni in modo transitorio senza dover disfare il codice.
Per implementarlo, è necessario creare il proprio intercettore personalizzato e registrarlo di conseguenza.
Una volta creata una classe che implementa l'interfaccia IDbCommandInterceptor, è possibile registrarla con Entity Framework utilizzando la classe DbInterception.
L'interfaccia IDbCommandInterceptor ha sei metodi ed è necessario implementare tutti questi metodi. Di seguito sono riportate le implementazioni di base di questi metodi.
Diamo un'occhiata al codice seguente in cui è implementata l'interfaccia IDbCommandInterceptor.
public class MyCommandInterceptor : IDbCommandInterceptor {
public static void Log(string comm, string message) {
Console.WriteLine("Intercepted: {0}, Command Text: {1} ", comm, message);
}
public void NonQueryExecuted(DbCommand command,
DbCommandInterceptionContext<int> interceptionContext) {
Log("NonQueryExecuted: ", command.CommandText);
}
public void NonQueryExecuting(DbCommand command,
DbCommandInterceptionContext<int> interceptionContext) {
Log("NonQueryExecuting: ", command.CommandText);
}
public void ReaderExecuted(DbCommand command,
DbCommandInterceptionContext<DbDataReader> interceptionContext) {
Log("ReaderExecuted: ", command.CommandText);
}
public void ReaderExecuting(DbCommand command,
DbCommandInterceptionContext<DbDataReader> interceptionContext) {
Log("ReaderExecuting: ", command.CommandText);
}
public void ScalarExecuted(DbCommand command,
DbCommandInterceptionContext<object> interceptionContext) {
Log("ScalarExecuted: ", command.CommandText);
}
public void ScalarExecuting(DbCommand command,
DbCommandInterceptionContext<object> interceptionContext) {
Log("ScalarExecuting: ", command.CommandText);
}
}
Registrazione degli intercettori
Una volta creata una classe che implementa una o più interfacce di intercettazione, è possibile registrarla con EF utilizzando la classe DbInterception come illustrato nel codice seguente.
DbInterception.Add(new MyCommandInterceptor());
Gli intercettatori possono anche essere registrati a livello di dominio dell'app usando la configurazione basata sul codice DbConfiguration come mostrato nel codice seguente.
public class MyDBConfiguration : DbConfiguration {
public MyDBConfiguration() {
DbInterception.Add(new MyCommandInterceptor());
}
}
Puoi anche configurare il file di configurazione dell'interceptor usando il codice -
<entityFramework>
<interceptors>
<interceptor type = "EFInterceptDemo.MyCommandInterceptor, EFInterceptDemo"/>
</interceptors>
</entityFramework>