Entity Framework - การสกัดกั้นคำสั่ง
ใน Entity Framework 6.0 มีคุณลักษณะใหม่อื่นที่เรียกว่า Interceptorหรือการสกัดกั้น รหัสการสกัดกั้นถูกสร้างขึ้นตามแนวคิดของinterception interfaces. ตัวอย่างเช่นอินเทอร์เฟซ IDbCommandInterceptor กำหนดเมธอดที่ถูกเรียกก่อนที่ EF จะเรียกใช้ ExecuteNonQuery, ExecuteScalar, ExecuteReader และวิธีการที่เกี่ยวข้อง
Entity Framework สามารถเปล่งประกายได้อย่างแท้จริงโดยใช้การสกัดกั้น การใช้วิธีนี้ช่วยให้คุณสามารถเก็บข้อมูลได้มากขึ้นชั่วคราวโดยไม่ต้องแก้รหัสของคุณ
ในการดำเนินการนี้คุณต้องสร้างตัวสกัดกั้นที่กำหนดเองของคุณเองและลงทะเบียนตามนั้น
เมื่อสร้างคลาสที่ใช้อินเทอร์เฟซ IDbCommandInterceptor แล้วจะสามารถลงทะเบียนกับ Entity Framework โดยใช้คลาส DbInterception
อินเทอร์เฟซ IDbCommandInterceptor มีหกวิธีและคุณต้องใช้วิธีการเหล่านี้ทั้งหมด ต่อไปนี้เป็นการใช้งานขั้นพื้นฐานของวิธีการเหล่านี้
มาดูโค้ดต่อไปนี้ซึ่งใช้อินเทอร์เฟซ 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);
}
}
การลงทะเบียน Interceptors
เมื่อสร้างคลาสที่ใช้อินเทอร์เฟซการสกัดกั้นอย่างน้อยหนึ่งคลาสแล้วจะสามารถลงทะเบียนกับ EF โดยใช้คลาส DbInterception ดังที่แสดงในโค้ดต่อไปนี้
DbInterception.Add(new MyCommandInterceptor());
นอกจากนี้ยังสามารถลงทะเบียนตัวสกัดกั้นที่ระดับโดเมนแอปโดยใช้การกำหนดค่าตามรหัส DbConfiguration ดังที่แสดงในรหัสต่อไปนี้
public class MyDBConfiguration : DbConfiguration {
public MyDBConfiguration() {
DbInterception.Add(new MyCommandInterceptor());
}
}
คุณยังสามารถกำหนดค่าไฟล์กำหนดค่า interceptor โดยใช้รหัส -
<entityFramework>
<interceptors>
<interceptor type = "EFInterceptDemo.MyCommandInterceptor, EFInterceptDemo"/>
</interceptors>
</entityFramework>