Entity Framework - przechwytywanie poleceń

W Entity Framework 6.0 dostępna jest kolejna nowa funkcja znana jako Interceptorlub przechwytywanie. Kod przechwytywania jest zbudowany wokół koncepcjiinterception interfaces. Na przykład interfejs IDbCommandInterceptor definiuje metody, które są wywoływane przed wywołaniem przez EF wywołania ExecuteNonQuery, ExecuteScalar, ExecuteReader i powiązanych metod.

  • Entity Framework może naprawdę błyszczeć, używając przechwytywania. Korzystając z tego podejścia, możesz przejściowo przechwycić znacznie więcej informacji bez konieczności porządkowania kodu.

  • Aby to zaimplementować, musisz stworzyć swój własny niestandardowy przechwytywacz i odpowiednio go zarejestrować.

  • Po utworzeniu klasy implementującej interfejs IDbCommandInterceptor można ją zarejestrować w Entity Framework przy użyciu klasy DbInterception.

  • Interfejs IDbCommandInterceptor ma sześć metod i wszystkie te metody należy zaimplementować. Poniżej przedstawiono podstawowe implementacje tych metod.

Rzućmy okiem na poniższy kod, w którym zaimplementowano interfejs 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);
   }

}

Rejestrowanie przechwytywaczy

Po utworzeniu klasy, która implementuje jeden lub więcej interfejsów przechwytywania, można ją zarejestrować w EF przy użyciu klasy DbInterception, jak pokazano w poniższym kodzie.

DbInterception.Add(new MyCommandInterceptor());

Interceptory można również zarejestrować na poziomie domeny aplikacji przy użyciu konfiguracji opartej na kodzie DbConfiguration, jak pokazano w poniższym kodzie.

public class MyDBConfiguration : DbConfiguration {

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

Możesz również skonfigurować plik konfiguracyjny przechwytywacza za pomocą kodu -

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