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>