Entity Framework - interceptação de comando

No Entity Framework 6.0, há outro novo recurso conhecido como Interceptorou interceptação. O código de interceptação é construído em torno do conceito deinterception interfaces. Por exemplo, a interface IDbCommandInterceptor define métodos que são chamados antes de EF fazer uma chamada para ExecuteNonQuery, ExecuteScalar, ExecuteReader e métodos relacionados.

  • O Entity Framework pode realmente brilhar usando interceptação. Usando essa abordagem, você pode capturar muito mais informações temporariamente, sem ter que desordenar seu código.

  • Para implementar isso, você precisa criar seu próprio interceptor customizado e registrá-lo de acordo.

  • Depois que uma classe que implementa a interface IDbCommandInterceptor foi criada, ela pode ser registrada com o Entity Framework usando a classe DbInterception.

  • A interface IDbCommandInterceptor possui seis métodos e você precisa implementar todos esses métodos. A seguir estão a implementação básica desses métodos.

Vamos dar uma olhada no código a seguir no qual a interface IDbCommandInterceptor é implementada.

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);
   }

}

Registrando Interceptadores

Depois que uma classe que implementa uma ou mais interfaces de interceptação foi criada, ela pode ser registrada com EF usando a classe DbInterception, conforme mostrado no código a seguir.

DbInterception.Add(new MyCommandInterceptor());

Os interceptores também podem ser registrados no nível do domínio do aplicativo usando a configuração baseada em código DbConfiguration, conforme mostrado no código a seguir.

public class MyDBConfiguration : DbConfiguration {

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

Você também pode configurar o arquivo de configuração do interceptor usando o código -

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