تأكد من تنظيم وحداتك بشكل جيد باستخدام حقنة نظيفة وقابلة لإعادة الاستخدام.

يتضمن إدخال خدمة من وحدة Nest.js مختلفة بضع خطوات لضمان حقن التبعية بشكل صحيح وتنظيم الوحدة. باستخدام نموذجين من الوحدات، تعرف على كيفية عمل عملية تصدير الخدمات واستيرادها.

إنشاء مشروع Nest.js

لإنشاء مشروع Nest.js، تحتاج إلى تثبيت واجهة سطر الأوامر (CLI) على جهازك. إذا لم تقم بذلك، قم بتشغيل هذا الأمر لتثبيته:

npm install -g @nestjs/cli

بعد تثبيت Nest.js CLI، قم بتشغيل هذا الأمر لإنشاء مشروع Nest.js جديد:

nest new

يمكنك استبدال ""بأي اسم تختاره. سيؤدي تشغيل الأمر أعلاه إلى إنشاء مشروع Nest.js جديد بالاسم المحدد.

يجب أن يبدو هيكل مشروعك الحالي كما في الصورة أدناه:

للتدرب على إدخال خدمة من وحدة نمطية إلى وحدة مختلفة، ستقوم بإنشاء وحدتين، الوحدة أ والوحدة ب. ستقوم أيضًا بإنشاء ملفات الخدمة ووحدة التحكم المقابلة لها.

قم بتشغيل هذا الأمر لإنشاء الوحدة النمطية أ:

nest generate modulemodule-a

وقم بتشغيل الأمر المكافئ للوحدة النمطية b:

nest generate modulemodule-b

ثم قم بتشغيل هذا الأمر لإنشاء ملفات الخدمة ووحدة التحكم للوحدة أ:

nest generate service module-a && nest generate controller module-a
instagram viewer

وقم بتشغيل الأمر المكافئ للوحدة النمطية b:

nest generate service module-b && nest generate controller module-b

يجب أن يبدو دليل مشروعك الحالي بهذا الشكل، مع src/module-a و src/module-b الدلائل:

تصدير خدمة من الوحدة أ

لتصدير خدمة الوحدة النمطية من الوحدة النمطية، يجب عليك إدراجها كتصدير في ملف الوحدة النمطية للوحدة أ (الوحدة النمطية-a.module.ts). بشكل افتراضي، لا يوفر Nest.js CLI صادرات مصفوفة في @وحدة Decorator، لذلك سيبدو ملف الوحدة النمطية الذي تم إنشاؤه كما يلي:

// module-a.module.ts
import { Module } from'@nestjs/common';
import { ModuleAService } from'./module-a.service';
import { ModuleAController } from'./module-a.controller';

@Module({
providers: [ModuleAService],
controllers: [ModuleAController],
})

exportclassModuleAModule{}

لتقديم الخدمة-(الوحدة النمطية-a.service.ts) يمكن الوصول إليها من خلال الوحدات النمطية التي تستورد الوحدة أ، وتنشئ صادرات مصفوفة في @وحدة ديكور وإضافة ModuleASService إليها.

مثل ذلك:

import { Module } from'@nestjs/common';
import { ModuleAService } from'./module-a.service';
import { ModuleAController } from'./module-a.controller';

@Module({
providers: [ModuleAService],
controllers: [ModuleAController],
exports: [ModuleAService],
})

exportclassModuleAModule{}

بعد ذلك، لأغراض الاختبار، قم بإضافة وظيفة بسيطة إلى الوحدة النمطية الخاصة بك - ملف الخدمة (الوحدة النمطية-a.service.ts):

import { Injectable } from'@nestjs/common';

@Injectable()
exportclassModuleAService{
getHello(): string {
return'Hello from Module A!';
}
}

تقوم هذه الدالة بإرجاع سلسلة عينة. للتأكد من أنه يمكنك استيراد هذه الخدمة بشكل صحيح، ستستدعي هذه الوظيفة من الوحدة النمطية-ب بعد إدخال الخدمة-أ.

استيراد خدمة إلى الوحدة ب

لاستيراد وحدة نمطية إلى أخرى، يجب عليك إدراجها كاستيراد في ملف الواردات مجموعة من وحدة الاستقبال. في هذه الحالة، يجب عليك إضافة الوحدة أ إلى ملف الواردات مجموعة من الوحدات ب @وحدة مصمم ديكور.

كما كان من قبل، لا يقوم Nest.js CLI تلقائيًا بإنشاء ملف الواردات المصفوفة، لذا يجب عليك إضافتها يدويًا.

أولاً، قم باستيراد الوحدة الأصلية (الوحدة النمطية-a.module.ts) في وحدة الاستقبال (الوحدة b.module.ts)، إنشاء الواردات مصفوفة، وإضافة ModuleAModule إلى المصفوفة:

// module-b.module.ts
import { Module } from'@nestjs/common';
import { ModuleBController } from'./module-b.controller';
import { ModuleBService } from'./module-b.service';
import { ModuleAModule } from'../module-a/module-a.module';

@Module({
imports: [ModuleAModule],
controllers: [ModuleBController],
providers: [ModuleBService],
})

exportclassModuleBModule{}

بعد ذلك، افتح جهازك الوحدة النمطية-b.service.ts ملف واستيراد حقن مصمم ديكور و ModuleAService من @أعشاش/شائعة و ../module-a/module-a.service، على التوالى:

import { Injectable, Inject } from'@nestjs/common';
import { ModuleAService } from'../module-a/module-a.service';

ال حقن يقوم الديكور بتحديد المعلمة الخاصة به كهدف لحقن التبعية.

التالي، في الخاص بك ModuleBService فئة، أضف كتلة التعليمات البرمجية أدناه:

@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;

تمنح كتلة التعليمات البرمجية أعلاه ModuleBService الخاص بك إمكانية الوصول إلى الطرق المتاحة في ModuleAService الخاص بك.

يمكنك اختبار الخدمة عن طريق الاتصال بـ ModuleAService getHello طريقة.

// module-b.service.ts
import { Injectable, Inject } from'@nestjs/common';
import { ModuleAService } from'src/module-a/module-a.service';

@Injectable()
exportclassModuleBService{
@Inject(ModuleAService)
private readonly moduleAService: ModuleAService;

getHello(): string {
returnthis.moduleAService.getHello();
}
}

بعد ذلك، افتح جهازك الوحدة النمطية-b.controller.ts قم بملف واستبدال الكود الذي تم إنشاؤه بكتلة التعليمات البرمجية أدناه:

// module-b.controller.ts
import { Controller, Get } from'@nestjs/common';
import { ModuleBService } from'./module-b.service';

@Controller('module-b')
exportclassModuleBController{
constructor(private readonly moduleBService: ModuleBService) {}

@Get('/hello')
getHello(): string {
returnthis.moduleBService.getHello();
}
}

تقوم كتلة التعليمات البرمجية أعلاه بإعداد a يحصل معالج الطريق ل getHello وظيفة.

أخيراً، تقديم طلب GET باستخدام الضفيرة إلى المضيف المحلي: 3000/module-b/hello. يجب أن يطبع الأمر "Hello from Module A!" إلى وحدة التحكم الخاصة بك.

لقد نجحت في إدخال خدمة في وحدة نمطية أخرى. يمكن أن يكون هذا مفيدًا عندما تكون كذلك بناء واجهات برمجة التطبيقات باستخدام Nest.js التي تحتوي على وحدات متعددة تحتاج إلى استدعاء أساليب بعضها البعض.

فوائد الحقن عبر الوحدات

على الرغم من أن استدعاء خدمة مباشرة من وحدة نمطية أخرى قد يبدو أبسط في البداية، إلا أنه قد يؤدي إلى نظام أكثر تعقيدًا وأقل قابلية للصيانة وأقل قابلية للتوسع على المدى الطويل.

ومع ذلك، فإن الحقن عبر الوحدات النمطية يعزز نمطية التعليمات البرمجية وإمكانية إعادة الاستخدام، مما يسهل صيانتها. بالإضافة إلى ذلك، فهو يعمل على مركزية التبعيات وتحسين قابلية الاختبار ودعم بنية منفصلة وقابلة للتطوير.