CodeShot
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 باشد.

شرکت‌هایی که این سؤال را پرسیده‌اند

دیجی‌کالا