NestJS / الأساسي: الوحدات وعقود الطلب / الدرس 4
رؤية الوحدة والتصدير والتركيب
وضح ملكية القدرات وشارك المزودين عبر حدود وحدات مقصودة.
في هذه الصفحة
أهداف الدرس
- اشرح اختلاف أدوار imports وproviders وcontrollers وexports.
- شخص فشل الرؤية دون إنشاء موارد مكررة.
تحدد الوحدة سطح قدرات عاماً
تغلف وحدات Nest تسجيل المزود افتراضياً؛ فلا يصبح المزود الداخلي قابلاً للحقن في كل التطبيق. تحدد exports ما يستهلكه الآخر وتدخل imports القدرة المصدرة إلى رسم المستهلك. ضع المتحكم قرب حالته ولا تصدر كل مساعد داخلي. يدعم الحد المراجعة والاستبدال، لكن اسم المجلد لا يفرض الملكية؛ يجب أن توافق البيانات والاستيرادات المعمارية بدلاً من تجاوزها بحالة عامة. يوضح السطح الضيق أي تغييرات قد تؤثر في وحدة أخرى وأي تفاصيل يمكن تعديلها داخل المالك دون وعد عام جديد.
صدر خدمة المالك بدلاً من إعادة تسجيلها
يصدر الجزء CatalogService من CatalogModule ويستورد الوحدة في ReportingModule، فتستطيع ReportsService الاعتماد عليها وفق الحاوية. إضافة الخدمة مستقلة إلى providers لدى المستهلك تسجيل آخر قد ينشئ مثيلاً غير مقصود باعتمادات مختلفة. شارك عقد الوحدة بدلاً منه. يفترض المثال التعريفات ولا يترجم تطبيقاً. ينبغي أن يملك مجمع المصدر خلف الخدمة دورة مقصودة لا يتضاعف كلما نسخ مستهلك إعلان المزود. وتظل رؤية الرمز مسألة تركيب منفصلة عن نجاح الخدمة في الاتصال بمصدرها وقت التشغيل.
@Module({providers:[CatalogService],exports:[CatalogService]})
export class CatalogModule {}
@Module({imports:[CatalogModule],providers:[ReportsService]})
export class ReportingModule {}
يستهلك ReportingModule الخدمة المصدرة عبر الاستيراد دون حل منشئ أو مجمع أو إقلاع.
تغير الوحدة العامة الرؤية لا ملكية المجال
قد يناسب التسجيل العام قدرات مشتركة قليلة، ولا ينبغي أن يكون علاج كل اعتماد مجهول. يخفي متطلبات المستهلك ويجعل الاختبار وإعادة الاستخدام تابعين لتركيب محيط. فضل الاستيراد الصريح لوحدات المجال ووثق الاستثناءات العامة. إعادة تصدير وحدة أخرى خيار مقصود ولا تجعل كل تفصيل انتقالي واجهة مستقرة. راجع الرمز المطلوب وهل ينتمي للسطح المدعوم. لا تحل سهولة الوصول مشكلة من يملك السياسة أو المورد؛ فقد ينتشر الاعتماد العام ويصعب معرفة المستهلكين الذين سيتأثرون بتغييره لاحقاً.
نمذج حد التصدير المعلن
يمثل نموذج المجموعات أسماء الرموز العامة لا حاوية Nest. يقبل قدرة القراءة المعلنة ويرفض المساعد الداخلي. يجعل القصد قابلاً للفحص، لكن الرؤية الحقيقية تتطلب الاستيراد والهوية والتسجيل. قارن الرسم بالبيانات الفعلية ولا تثق بالمخطط وحده. لا تعرض كتابة داخلية لمجرد ترجمة وحدة تقارير؛ اختر عقد قراءة ضيقاً يمنحها السلطة المطلوبة فقط. يوضح الاختبار حد الاسم المعلن ولا يثبت تنفيذ سياسة وصول أو قدرة الحاوية على بناء مزود خلفه.
const advertised=new Set(["COURSE_READER"]);
function visible(token) {return advertised.has(token);}
console.assert(visible("COURSE_READER"));
console.assert(!visible("INTERNAL_REVIEW_WRITER"));
يرى النموذج الرمز المعلن فقط ولا يفحص مزخرفات Nest أو يترجم وحدات حقيقية.
عامل الدورة كإشارة تصميم قبل الحل الالتفافي
تختلف دورة المزود عن دورة استيراد الوحدة وقد تربك كل منهما البناء. استخرج سياسة مشتركة أو تنسيقاً عندما يعتمد مجالان على داخل بعضهما. تؤجل forwardRef المرجع حيث تدعم ولا تصلح ملكية ملتبسة أو تضمن ترتيب تهيئة مطلوباً. أبعد العمل المعتمد على الترتيب عن المنشئ. اختبر تركيباً صغيراً ببدائل عند الإذن؛ يشغل المقرر مجموعة السطح فقط ولا معالجة الدورة. يساعد التمييز في تجنب إضافة مرجع مؤجل لكل خطأ بينما السبب الحقيقي رمز غير مصدر أو استيراد ملف دائري.
الأخطاء الشائعة وإصلاحها
لا يحقن المستهلك مزوداً داخلياً
- لماذا يحدث؟
- لم تصدر الوحدة المالكة القدرة، أو لم يستورد المستهلك الوحدة التي تملكها.
- كيف تصلحه؟
- أصلح علاقة التصدير والاستيراد المقصودة بدلاً من إضافة تسجيل عشوائي.
- كيف تتجنب تكراره؟
- ترجم أصغر رسم وحدات للمستهلك باستخدام مصدر بديل.
ينشئ المستهلكون عملاء مصدر متعددين
- لماذا يحدث؟
- أعيد إعلان المزود في المستهلك بدلاً من استهلاك تصدير الوحدة المالكة.
- كيف تصلحه؟
- شارك عقد الوحدة المالكة وراجع دورة حياة المثيل والمورد.
- كيف تتجنب تكراره؟
- تتبع ملكية المزود وعدد المثيلات المقصود في التصميم.
تخفي وحدة عامة شروطاً مفقودة
- لماذا يحدث؟
- حلت الرؤية المحيطة العامة محل التصريح باعتمادات المجال المطلوبة.
- كيف تصلحه؟
- استعمل استيرادات واضحة ووثق الرموز العامة الاستثنائية.
- كيف تتجنب تكراره؟
- اختبر الوحدة خارج غلاف التطبيق الكامل حتى تظهر متطلباتها المخفية.
اختبر فهمك
1. لماذا تنطوي إضافة CatalogService إلى كل مصفوفة providers على خطر؟
اعرض الحل المشروح
قد تنشئ هذه الإضافات تسجيلات مستقلة لكل منها حالة وعمر موارد منفصلان، كما تخفي الوحدة التي تملك الخدمة. استورد الوحدة التي تصدر الخدمة المقصودة. وإذا احتاج التصميم بالفعل إلى مثيلات منفصلة، فاجعل ذلك قدرة مسماة ومقصودة، واختبر الفرق بينها بدلاً من نشوئه عرضياً من تكرار بيانات التسجيل.
2. هل تجعل forwardRef تصميم مجال ذي اعتمادات دائرية جيد البنية؟
اعرض الحل المشروح
لا. تعالج forwardRef توقيت المراجع في سيناريوهات الربط التي تدعمها، ولا تقرر مسؤوليات العمل. حدد أولاً هل الدورة بين المزودين أم الوحدات أم استيرادات الملفات، وفكر في استخراج سياسة مشتركة. تحقق من سلوك الحاوية الحقيقي مستقلاً، ولا تعتمد الحل الالتفافي لإثبات ترتيب معين لاستدعاء المنشئات أو خطوات التهيئة.
أهم ما تعلمته
- تمثل التصديرات سطح قدرات الوحدة المدعوم.
- تحفظ إصلاحات الرؤية الملكية وأعمار الموارد.