Entity Framework - Intercepción de comandos

En Entity Framework 6.0, hay otra característica nueva conocida como Interceptoro intercepción. El código de interceptación se basa en el concepto deinterception interfaces. Por ejemplo, la interfaz IDbCommandInterceptor define métodos que se llaman antes de que EF haga una llamada a ExecuteNonQuery, ExecuteScalar, ExecuteReader y métodos relacionados.

  • Entity Framework realmente puede brillar mediante el uso de la interceptación. Con este enfoque, puede capturar mucha más información de forma transitoria sin tener que desordenar su código.

  • Para implementar esto, debe crear su propio interceptor personalizado y registrarlo en consecuencia.

  • Una vez que se ha creado una clase que implementa la interfaz IDbCommandInterceptor, se puede registrar con Entity Framework usando la clase DbInterception.

  • La interfaz IDbCommandInterceptor tiene seis métodos y debe implementar todos estos métodos. A continuación se muestra la implementación básica de estos métodos.

Echemos un vistazo al siguiente código en el que se implementa la interfaz 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);
   }

}

Registro de interceptores

Una vez que se ha creado una clase que implementa una o más de las interfaces de interceptación, se puede registrar con EF usando la clase DbInterception como se muestra en el siguiente código.

DbInterception.Add(new MyCommandInterceptor());

Los interceptores también se pueden registrar en el nivel de dominio de la aplicación utilizando la configuración basada en código DbConfiguration como se muestra en el siguiente código.

public class MyDBConfiguration : DbConfiguration {

   public MyDBConfiguration() {
      DbInterception.Add(new MyCommandInterceptor());
   }
}

También puede configurar el archivo de configuración del interceptor usando el código -

<entityFramework>
   <interceptors>
      <interceptor type = "EFInterceptDemo.MyCommandInterceptor, EFInterceptDemo"/>
   </interceptors>
</entityFramework>