تكرار السؤال: …
الإجابة المختصرة
حاوية الـ DI هي المسؤولة حصراً عن استدعاء Dispose() تلقائياً لجميع الخدمات التي أنشأتها هي، عند انتهاء فترة حياة النطاق (Scope) أو انتهاء التطبيق للـ Singletons.
الشرح
قاعدة أساسية: من يُنشئ المورد هو من ينظفه. إذا قامت الحاوية بإنشاء خدمة Scoped تطبق IDisposable، ستقوم الحاوية تلقائياً باستدعاء Dispose() عليها فور اكتمال طلب الـ HTTP وتدمير النطاق. استثناء وحيد خطير: إذا قمت بتسجيل نسخة جاهزة مسبقاً بنفسك عبر services.AddSingleton(new MyService())، فإن الحاوية لن تستدعي Dispose() عليها ويجب عليك تنظيفها يدوياً.
مثال بالكود
// الحاوية تنشئ الكائن وستستدعي Dispose() تلقائياً:
builder.Services.AddScoped<MyDisposableService>();
// الحاوية لا تمتلك النسخة ولن تستدعي Dispose():
builder.Services.AddSingleton(new MyDisposableService());أخطاء شائعة
- استدعاء دالة Dispose() يدوياً داخل كود المتحكم لخدمة تم حقنها بواسطة الـ DI Container.
أسئلة متابعة
- كيف يطبق نمط التخلص القياسي (IDisposable Pattern) وما الفرق بين الموارد المدارة وغير المدارة (Managed vs Unmanaged)؟
- ما هي تبعية الأسير (Captive Dependency) في حاوية الـ DI بـ .NET وكيف تكتشفها وتمنعها؟