تبدیل کدهای روزمره به منبع یادگیری و آزمون فنی با GitHub Copilot
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۵/۲۹ ۱۳:۰۶
آدرس: www.dntips.ir
public async Task<IReadOnlyList<Order>> GetOrdersAsync(
CancellationToken cancellationToken)
{
return await _db.Orders
.AsNoTracking()
.Where(x => x.Status == OrderStatus.Pending)
.ToListAsync(cancellationToken);
}در نقش یک مصاحبهکننده ارشد و معمار نرمافزار .NET عمل کن.
بر اساس این متد، مجموعهای از پرسشهای فنی سطح بالا (Senior-level) به همراه پاسخهای ایدهآل و جامع استخراج کن.
محورهای ارزیابی:
۱. رفتارهای داخلی EF Core: مکانیزم و اثرات استفاده از .AsNoTracking() بر مصرف حافظه، Garbage Collection و تفاوت آن با NoTrackingWithIdentityResolution.۲. مفاهیم Async/Await و مدیریت رشتهها: تحلیل ماشین وضعیت (State Machine)، سربار تخصیصTaskدر مقایسه باValueTaskو چرخه حیات نخها در ThreadPool.
۳. لغو عملیات (Cancellation): نحوه انتشار CancellationToken از سطح وب به درایور پایگاه داده و رفتار درایورهای دیتابیس در زمان دریافت سیگنال Cancel.۴. پایگاه داده و ایندکسگذاری: چه ساختار ایندکسی (مانند B-Tree Filtered Index) برای ستون Status روی جدول سفارشات بهترین بازدهی را دارد؟۵. طراحی معماری و قراردادها: چرا بازگرداندن مستقیم Order (موجودیت دامنه) به جای DTO یا رکوردهای اختصاصی یک ضدالگو در لایه API محسوب میشود؟۶. تایپ بازگشتی: تفاوتهای رفتاری و عملکردی میانIReadOnlyList،IEnumerableوList.
.AsNoTracking() در این سناریو حیاتی است و چه اثری در سطح رانتایم دارد؟AsNoTracking اجرا میشود، EF Core برای تکتک موجودیتهای واکشیشده یک نمونه EntityEntry داخل ChangeTracker میسازد و کپی از مقادیر اولیه (Snapshot) را در حافظه نگه میدارد تا تغییرات را ردیابی کند. در سناریوهای صرفاً خواندنی (Read-only)، AsNoTracking با حذف این فرآیند، مصرف حافظه و بار Garbage Collector را به شدت کاهش داده و سرعت اجرای کوئری را افزایش میدهد.Status یک فیلد با گوناگونی پایین (Low Cardinality) است و ما فقط به دنبال وضعیت Pending هستیم، ساخت یک Filtered Index در دیتابیسهایی مثل SQL Server یا PostgreSQL بسیار بهینهتر از یک ایندکس استاندارد روی کل جدول است:CREATE NONCLUSTERED INDEX IX_Orders_PendingStatus ON Orders(Id) WHERE Status = 0; -- Pending
cancellationToken چگونه جلوی هدررفت منابع دیتابیس را میگیرد؟Microsoft.Data.SqlClient) پاس داده میشود. درایور پس از فعال شدن توکن، یک سیگنال وقفه اضطراری (مانند بسته ATTN در پروتکل TDS برای SQL Server) به سرور پایگاه داده میفرستد تا اجرای کوئری در همان نقطه توسط دیتابیس لغو شده و منابع پردازشی سرور آزاد شوند.