تكرار السؤال: …
الإجابة المختصرة
هو نمط تصميمي يقضي بتمرير التبعيات التي يحتاجها الكائن من الخارج بدلاً من قيام الكائن بإنشائها بنفسه داخل الـ Constructor.
الشرح
يحقق حقن التبعيات مبدأ Inversion of Control ويفصل بين مسؤولية استخدام الكائن ومسؤولية تكوينه. يسهل DI كتابة اختبارات الوحدة (Unit Testing) عن طريق استبدال التبعيات الحقيقية بمجسمات وهمية (Fakes/Mocks)، كما يقلل الاقتران الوثيق (Coupling) ويسهل صيانة وتعديل أجزاء التطبيق مستقبلاً.
مثال بالكود
// بدون DI (اقتران وثيق يصعب اختباره):
class Car {
private val engine = Engine() // ينشئ تبعيته بنفسه
}
// مع DI (مرن وسهل الاستبدال في الاختبار):
class Car(private val engine: Engine) { // يستقبل تبعيته من الخارج
}أخطاء شائعة
- الخلط بين مكتبات حقن التبعيات الحقيقية ومحددات الخدمة (Service Locator) التي تخفي التبعيات وتصعب اكتشاف الأخطاء وقت الترجمة.