هنرجو
حلشده
تفاوت Scoped، Transient و Singleton در Dependency Injection چیست؟
آرمین کریمی
1405/05/12 10:12
💬 2 پاسخ
◉ 186 بازدید
پاسخها
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 وابسته باشد.
آرمین کریمی
هنرجو
متوجه شدم؛ با Scoped کردن DbContext مشکل تغییرات همزمانی که داشتم برطرف شد. ممنون از توضیح درباره Captive Dependency.