المزوّدات والخدمات
المزوّدات والخدمات
إن كانت المتحكّمات هي "كيف تَرِد الطلبات"، فالمزوّدات هي "حيث يجري العمل". المزوّد أي صنف يستطيع NestJS حقنه كتبعية — وأشيعها خدمة تحتوي منطق العمل. في هذا الدرس يتّضح أخيرًا مفهوم حقن التبعيات، قلب NestJS.
تعريف خدمة
الخدمة صنف مُعلَّم بالمُزخرِف @Injectable(). يخبر هذا المُزخرِف NestJS: "يمكن إدارة هذا الصنف وحقنه":
حقن خدمة في متحكّم
أنت لا تستدعي new UsersService() بنفسك. بل تُعلِنها كمعامل في الباني ويزوّدك NestJS بالنسخة — هذا هو حقن التبعيات:
الاختصار private readonly usersService يُعلِن التبعية ويُسنِدها في سطر واحد. يرى NestJS النوع UsersService ويحقن النسخة الصحيحة.
تسجيل المزوّد
كي يعمل الحقن، يجب إدراج الخدمة في مصفوفة providers لوحدةٍ ما:
مفردات (Singletons) افتراضيًا
افتراضيًا كل مزوّد هو مفرد (singleton) — يُنشئ NestJS نسخة واحدة ويشاركها عبر التطبيق كلّه. احقن UsersService في عشرة متحكّمات وستتشارك العشرة الكائن نفسه وحالته.
لماذا يتفوّق حقن التبعيات
- قابلية الاختبار: في الاختبار تحقن خدمة وهميّة بدل الحقيقية — دون تغيير الكود.
- اقتران مرن: تعتمد الأصناف على تجريدات يوفّرها الحاوي، لا على كائنات تبنيها بنفسها.
- مسؤولية واحدة: المتحكّمات تُوجّه والخدمات تحسب، ويبقى كلٌّ صغيرًا.
providers، أو أنّ الوحدة التي تُصدّره لم تُستورَد. اقرأ التلميح بين القوسين في الرسالة — فهو يسمّي التبعية المفقودة.
الخلاصة
المزوّدات — عادةً خدمات مُعلَّمة بـ @Injectable() — تحتوي منطق عملك وتُزوَّد للمتحكّمات عبر حقن الباني. سجّلها في مصفوفة providers للوحدة؛ وهي مفردات افتراضيًا. حقن التبعيات هو ما يُبقي تطبيقات NestJS قابلة للاختبار ومرنة الاقتران وسهلة النمو. بهذا تكتمل المرحلة الأولى: تستطيع الآن بناء واجهة NestJS مُهيكَلة وعاملة.