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>