تكرار السؤال: …
الإجابة المختصرة
Transient تنشئ نسخة جديدة مع كل طلب حقن، وScoped تنشئ نسخة واحدة لكل طلب HTTP تشترك فيها كل المكونات، وSingleton تنشئ نسخة واحدة للأبد تشاركها كامل العملية.
الشرح
تعد إدارة فترات الحياة الركيزة الأساسية للـ Dependency Injection. استخدم Transient للخدمات الخفيفة عديمة الحالة. استخدم Scoped للخدمات التي تحتفظ بحالة الطلب الحالي أو تتشارك سياقاً مثل Entity Framework DbContext. استخدم Singleton للخدمات باهظة الإنشاء التي تحتفظ بذاكرة كاش مشتركة أو تدير مقابس شبكة دائمة.
مثال بالكود
builder.Services.AddTransient<IEmailSender, EmailSender>();
builder.Services.AddScoped<IOrderService, OrderService>();
builder.Services.AddSingleton<ICacheManager, MemoryCacheManager>();أخطاء شائعة
- حقن خدمة Scoped داخل خدمة Singleton مما يخلق خطأ Captive Dependency الكارثي.
أسئلة متابعة
- ما هي تبعية الأسير (Captive Dependency) في حاوية الـ DI بـ .NET وكيف تكتشفها وتمنعها؟
- من المسؤول عن استدعاء دالة Dispose() للخدمات التي تطبق IDisposable عند استخدام حاوية .NET DI؟