یک نکتهی تکمیلی: طراحی یک Interceptor برای یک دست سازی ی و ک در EF Core
یکی از ویژگیهای جدید EF Core 3.0، بازگشت مجدد Interceptorهایی است که در این مطلب در مورد آنها بحث شدهاست. اگر بخواهیم مطلب جاری را برای EF Core 3.0 بازنویسی کنیم، به کلاس زیر خواهیم رسید:
و روش استفاده و معرفی آن به سیستم توسط متد AddInterceptors، به صورت زیر است:
یکی از ویژگیهای جدید EF Core 3.0، بازگشت مجدد Interceptorهایی است که در این مطلب در مورد آنها بحث شدهاست. اگر بخواهیم مطلب جاری را برای EF Core 3.0 بازنویسی کنیم، به کلاس زیر خواهیم رسید:
using System; using System.Data; using System.Data.Common; using System.Threading; using System.Threading.Tasks; using DNTPersianUtils.Core; // dotnet add package DNTPersianUtils.Core using Microsoft.EntityFrameworkCore.Diagnostics; namespace EFCore3Interceptors { public class PersianYeKeCommandInterceptor : DbCommandInterceptor { public override InterceptionResult<DbDataReader> ReaderExecuting( DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result) { ApplyCorrectYeKe(command); return result; } public override Task<InterceptionResult<DbDataReader>> ReaderExecutingAsync( DbCommand command, CommandEventData eventData, InterceptionResult<DbDataReader> result, CancellationToken cancellationToken = new CancellationToken()) { ApplyCorrectYeKe(command); return Task.FromResult(result); } public override InterceptionResult<int> NonQueryExecuting( DbCommand command, CommandEventData eventData, InterceptionResult<int> result) { ApplyCorrectYeKe(command); return result; } public override Task<InterceptionResult<int>> NonQueryExecutingAsync( DbCommand command, CommandEventData eventData, InterceptionResult<int> result, CancellationToken cancellationToken = new CancellationToken()) { ApplyCorrectYeKe(command); return Task.FromResult(result); } public override InterceptionResult<object> ScalarExecuting( DbCommand command, CommandEventData eventData, InterceptionResult<object> result) { ApplyCorrectYeKe(command); return result; } public override Task<InterceptionResult<object>> ScalarExecutingAsync( DbCommand command, CommandEventData eventData, InterceptionResult<object> result, CancellationToken cancellationToken = new CancellationToken()) { ApplyCorrectYeKe(command); return Task.FromResult(result); } private static void ApplyCorrectYeKe(DbCommand command) { command.CommandText = command.CommandText.ApplyCorrectYeKe(); foreach (DbParameter parameter in command.Parameters) { switch (parameter.DbType) { case DbType.AnsiString: case DbType.AnsiStringFixedLength: case DbType.String: case DbType.StringFixedLength: case DbType.Xml: parameter.Value = parameter.Value is DBNull ? parameter.Value : parameter.Value.ToString().ApplyCorrectYeKe(); break; } } } } }
و روش استفاده و معرفی آن به سیستم توسط متد AddInterceptors، به صورت زیر است:
namespace EFCore3Interceptors { public class BloggingContext : DbContext { // ... protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder .UseSqlServer("...") .AddInterceptors(new PersianYeKeCommandInterceptor()); } } } }