تكرار السؤال: …
الإجابة المختصرة
لأنه يخفي التبعيات الحقيقية للفئة، ويعطل فحص المترجم الساكن، ويصعب كتابة اختبارات الوحدة، وقد يؤدي لأخطاء وقت التشغيل عند طلب خدمات غير مسجلة.
الشرح
عندما تطلب الفئة IServiceProvider في الباني، لا يعلم المطور الخارجي ما هي التبعيات الفعلية التي تحتاجها الفئة لتعمل، ويفشل فحص التبعيات عند الإنشاء. الممارسة الهندسية الصحيحة هي التصريح الصريح عن كل التبعيات في الباني (Constructor Injection)، مما يجعل الفئة ذات مسؤولية واضحة ويسهل استبدال التبعيات بـ Mocks في اختبارات الوحدة.
مثال بالكود
// نمط مضاد سيء (Service Locator):
public class OrderService(IServiceProvider provider) {
public void Process() {
var repo = provider.GetRequiredService<IOrderRepo>(); // تبعية مخفية!
}
}
// الطريقة الصحيحة الصريحة (Constructor Injection):
public class OrderService(IOrderRepo repo) { ... }أخطاء شائعة
- حقن IServiceProvider لتفادي كتابة 5 معاملات في الباني، بدلاً من إدراك أن الفئة متضخمة وتنتهك مبدأ Single Responsibility.