Midسختی 3 از ۵· در 88٪ مصاحبههای این حوزه پرسیده شده
تفاوت Singleton، Scoped و Transient در ASP.NET Core چیست؟
☆نشان کردنپاسخ کوتاه
طول عمر سرویس را تعیین میکنند: Singleton یک نمونه برای کل برنامه، Scoped یک نمونه بهازای هر درخواست، Transient یک نمونه در هر بار درخواست از Container.
پاسخ کامل
| Lifetime | تعداد نمونه | کاربرد معمول |
|---|---|---|
Singleton |
یک نمونه در کل عمر برنامه | کش، تنظیمات، سرویسهای بدون حالت و Thread-safe |
Scoped |
یک نمونه بهازای هر HTTP Request | DbContext، Repository، Unit of Work |
Transient |
نمونه جدید در هر بار Resolve | سرویسهای سبک و بدون حالت |
نکته حیاتی: تزریق یک سرویس Scoped داخل یک سرویس Singleton باعث Captive Dependency میشود — سرویس Scoped تا پایان عمر برنامه زنده میماند و رفتار غیرقابل پیشبینی (و در مورد DbContext، خطاهای همزمانی) ایجاد میکند.
مثال کد
services.AddSingleton<IClock, SystemClock>();
services.AddScoped<IOrderRepository, SqlOrderRepository>();
services.AddTransient<IEmailBuilder, EmailBuilder>();
نکته مهم
در محیط Development، ASP.NET Core با ValidateScopes این خطا را هنگام اجرا تشخیص میدهد؛ در Production بهصورت پیشفرض غیرفعال است.
اشتباه رایج
❌ ثبت DbContext بهصورت Singleton. DbContext مطلقاً Thread-safe نیست و باید Scoped باشد.
شرکتهایی که این سؤال را پرسیدهاند
دیجیکالا
