← بازگشت به تالار
هنرجو حل‌شده

تفاوت Scoped، Transient و Singleton در Dependency Injection چیست؟

آرمین کریمی 1405/05/12 10:12 💬 2 پاسخ ◉ 186 بازدید
در یک پروژه ASP.NET Core برای Repository و Service از AddScoped استفاده کرده‌ام، اما هنوز دقیقاً نمی‌دانم چه زمانی باید از Transient یا Singleton استفاده کنم. آیا می‌توان DbContext را Singleton ثبت کرد؟ لطفاً با یک مثال عملی توضیح دهید.

پاسخ‌ها

2 پاسخ ثبت‌شده
مهندس سارا احمدی مدرس ✓ پاسخ پذیرفته‌شده
Scoped در هر HTTP Request یک نمونه می‌سازد و برای DbContext و Serviceهایی که به آن وابسته‌اند انتخاب معمول است. Transient در هر Resolve نمونه جدید می‌سازد و برای سرویس‌های سبک و بدون State مناسب است. Singleton در تمام عمر برنامه فقط یک نمونه دارد و باید Thread-safe باشد. DbContext را Singleton ثبت نکنید؛ چون Thread-safe نیست، Change Tracker آن بین درخواست‌ها مشترک می‌شود و ممکن است داده یا اتصال اشتباه در اختیار چند کاربر قرار بگیرد. الگوی رایج: services.AddDbContext<AppDbContext>(options => ...); // به‌صورت Scoped services.AddScoped<ICourseService, CourseService>(); services.AddTransient<IEmailFormatter, EmailFormatter>(); services.AddSingleton<ISystemClock, SystemClock>(); همیشه Lifetime وابستگی‌ها را هم بررسی کنید؛ یک Singleton نباید مستقیماً به Scoped وابسته باشد.
▲ 18 ▼ 0
آرمین کریمی هنرجو
متوجه شدم؛ با Scoped کردن DbContext مشکل تغییرات هم‌زمانی که داشتم برطرف شد. ممنون از توضیح درباره Captive Dependency.
▲ 4 ▼ 0