الوحدات الديناميكية ونطاقات المزوّدات
الوحدات الديناميكية ونطاقات المزوّدات
حتى الآن كانت الوحدات ساكنة — إعدادات ثابتة. لكن كيف تقبل ConfigModule.forRoot() خيارات؟ تلك وحدة ديناميكية: وحدة تُضبَط وقت الاستيراد. ومقترنةً بـ نطاقات المزوّدات، هذه هي الأدوات التي تجعل وحدات NestJS قابلة لإعادة الاستخدام ومرنة.
نمط forRoot / forFeature
رأيت هذا في كل مكان: ConfigModule.forRoot() وTypeOrmModule.forRoot() وJwtModule.register(). كلٌّ دالّة ساكنة تُعيد وحدة مضبوطة على الفور.
الآن يمرّر المستهلكون الخيارات عند الاستيراد:
forRoot() وحدة مرّة للتطبيق كلّه (الجذر)؛ وتضبط forFeature() شريحة لوحدة ميزة محدّدة. وتُستخدَم register() حين لا يوجد تمييز بين عام وميزة.
نطاقات المزوّدات
افتراضيًا كل مزوّد مفرد — نسخة واحدة مشتركة على مستوى التطبيق. يوفّر NestJS ثلاثة نطاقات:
- DEFAULT (مفرد) — نسخة واحدة مشتركة. سريع، والخيار الصحيح لكل شيء تقريبًا.
- REQUEST — نسخة جديدة لكل طلب وارد.
- TRANSIENT — نسخة جديدة لكل مستهلك يحقنه.
متى تحتاج نطاق REQUEST
نطاق الطلب مفيد حين يجب أن يحمل المزوّد بيانات خاصّة بالطلب الحالي — المستخدم المُصادَق، أو معرّف تتبّع لكل طلب، أو معلومات المستأجر في تطبيق متعدّد المستأجرين. ويستطيع المزوّد ذو نطاق الطلب حقن كائن الطلب نفسه:
تكلفة نطاق الطلب
AsyncLocalStorage، بدل جعل خدمة كاملة بنطاق طلب. أبقِ المفردات مفردات كلّما أمكن.
الخلاصة
تُعيد الوحدات الديناميكية (نمط forRoot/forFeature/register) كائن DynamicModule مضبوطًا وقت الاستيراد، وهكذا تعمل وحدات المكتبات القابلة للإعداد. وتتحكّم نطاقات المزوّدات في عمر النسخة: المفردات الافتراضية هي القاعدة؛ وتوجد REQUEST وTRANSIENT لحالة الطلب أو المستهلك، لكنها تتصاعد وتكلّف أداءً. بهذا تكتمل المرحلة الثانية — صرت تفهم كيف يربط NestJS ويضبط كل شيء.