| وجه المقارنة المعمارية | الإنشاء المباشر والتقليدي (Direct Instantiation) | حقن الاعتماديات في أنگولر (Dependency Injection) |
|---|---|---|
| الارتباط والاقتران (Coupling) | ارتباط قوي جداً (`Tight Coupling`) حيث يعتمد الكلاس مباشرة على تفاصيل بناء الكلاسات الأخرى، مما يصعب التعديل والاختبار | ارتباط مرن وضعيف (`Loose Coupling`) يعتمد على الواجهات والتجريد، مما يسهل استبدال الكلاسات واختبارها |
| إدارة دورة الحياة (Lifecycle Management) | يتحمل المطور مسؤولية إنشاء وتدمير الكائنات يدويًا، مما قد يؤدي لتسريب الذاكرة | يدير إطار العمل أنگولر دورة حياة الكائنات بذكاء وبشكل تلقائي كـ Singletons أو حسب نطاق الحقن |
| قابلية الاختبار (Testability) | صعبة للغاية لأن التبعيات الحقيقية تكون مخفية ومثبتة داخل كود الصنف | عالية جداً بفضل إمكانية حقن خدمات وهمية (`Mock Services`) بكل سهولة أثناء الاختبارات وحدات البرمجية (`Unit Tests`) |
يُعد حقن الاعتماديات (Dependency Injection - DI) هو الآلية المعمارية الأساسية لإدارة التبعيات والربط بين مكونات النظام المختلفة. بدلاً من أن يقوم المكون بإنشاء النسخ الخاصة به من الخدمات والاعتماديات يدويًا (ما يخلق ارتباطًا وثيقًا ومعقدًا)، يتولى إطار العمل (Angular Injector) مسؤولية إنشاء هذه التبعيات وتوفيرها للمكونات والخدمات عند الحاجة بناءً على سياق الشجرة المعمارية.
بدلاً من أن يتحكم الكلاس في جلب ما يحتاجه للعمل، يتم "عكس" السيطرة بحيث يقوم نظام أنگولر بتمرير وحقن هذه الاعتماديات إليه تلقائياً، مما يجعل الأكواد أكثر نظافة وقابلة للتوسع والصيانة.
يعتمد نظام الـ DI في أنگولر على شجرة هرمية تتوافق مع شجرة المكونات، مما يتيح لك توفير الخدمات على مستوى التطبيق بالكامل (root) أو قصرها على نطاق مكون محدد وشجرته الفرعية.
| 1 | import { Injectable } from '@angular/core'; |
| 2 | |
| 3 | @Injectable({ |
| 4 | providedIn: 'root', // توفير الخدمة على مستوى التطبيق كـ Singleton |
| 5 | }) |
| 6 | class LoggerService { |
| 7 | log(message: string): void { |
| 8 | console.log(`[معمارية DI - أنگولر 22.1]: ${message}`); |
| 9 | } |
| 10 | } |