تكرار السؤال: …
الإجابة المختصرة
DIP هو مبدأ معماري يفرض أن الوحدات عالية المستوى والتفاصيل منخفضة المستوى يجب أن تعتمد كلاهما على التجريدات (Abstractions)، بينما DI هو نمط برمجي لتمرير التبعيات من الخارج.
الشرح
في المعماريات التقليدية، تعتمد طبقة الأعمال (High-level Business Logic) مباشرة على طبقة البيانات (SQL Database Client). مبدأ DIP يعكس هذا الاتجاه: طبقة الأعمال تحدد واجهة تجريدية (Port/Contract) تلبي احتياجاتها، وطبقة البيانات تنفذ هذه الواجهة (Adapter). بذلك تصبح قواعد العمل مستقلة تماماً عن تفاصيل قواعد البيانات أو مزودي الخدمات السحابية.
مثال بالكود
// طبقة الأعمال تمتلك العقد:
interface NotificationSender {
send(message: string): Promise<void>;
}
// طبقة الأعمال تعتمد على الواجهة المجردة:
class OrderService {
constructor(private notifier: NotificationSender) {}
}أخطاء شائعة
- اعتبار أن استخدام مكتبات مثل Inversify أو Dagger هو تطبيق تلقائي لـ DIP، في حين أن جوهر المبدأ هو ملكية الواجهة والاتجاه المعماري للتبعية.