حاوية حقن التبعية لـ TypeScript: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هي حاوية حقن التبعية لـ TypeScript؟



حقن التبعية (DI) هو نمط تصميم يحصل فيه الكائن على تبعياته من الخارج، بدلاً من إنشائها بنفسه. حاوية DI هي أداة تدير إنشاء وحقن هذه التبعيات تلقائياً. في TypeScript، وبفضل الكتابة الثابتة، تكون حاويات DI فعالة بشكل خاص: فهي توفر أمان النوع وتبسط الاختبار.



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



لماذا نحتاج إلى حاوية DI في TypeScript؟



  • تقليل اقتران الكود — لا تعتمد الفئات على تطبيقات محددة، بل فقط على التجريدات (الواجهات).
  • تبسيط الاختبار — يمكن استبدال التبعيات بسهولة بـ mocks أو stubs.
  • إدارة دورة الحياة — يمكن للحاوية إنشاء كائنات مفردة (singletons)، أو كائنات عابرة (transient)، أو كائنات بنطاق محدد.
  • الحل التلقائي للتبعيات — تقوم الحاوية ببناء شجرة التبعيات بنفسها، مما يريح المطور من البناء اليدوي للكائنات.


حاويات DI الشائعة لـ TypeScript



دعنا نلقي نظرة على المكتبتين الأكثر شيوعاً: InversifyJS و TSyringe. كلتاهما تدعمان TypeScript، ولكن لهما نهجين مختلفين.



1. InversifyJS



InversifyJS هي حاوية IoC قوية مع مزينات (decorators). تتطلب تحديد التبعيات بشكل صريح من خلال المزينات @injectable() و @inject(). مناسبة للمشاريع الكبيرة ذات البنية الواضحة.



التثبيت

npm install inversify reflect-metadata --save


في ملف tsconfig.json، تأكد من تضمين:

{  "compilerOptions": {    "experimentalDecorators": true,    "emitDecoratorMetadata": true  }}


مثال على الاستخدام

import { Container, injectable, inject } from "inversify";import "reflect-metadata";

// تعريف واجهة ورمز للربطinterface ILogger { log(message: string): void;}const TYPES = { ILogger: Symbol.for("ILogger"), IUserService: Symbol.for("IUserService"),};

// تطبيق المسجل@injectable()class ConsoleLogger implements ILogger { log(message: string): void { console.log(`[LOG]: ${message}`); }}

// خدمة تعتمد على المسجل@injectable()class UserService { constructor(@inject(TYPES.ILogger) private logger: ILogger) {}

createUser(name: string): void { this.logger.log(`المستخدم ${name} تم إنشاؤه`); }}

// إعداد الحاويةconst container = new Container();container.bind<ILogger>(TYPES.ILogger).to(ConsoleLogger).inSingletonScope();container.bind<UserService>(TYPES.IUserService).to(UserService);

// الاستخدامconst userService = container.get<UserService>(TYPES.IUserService);userService.createUser("أليكسي");


2. TSyringe



TSyringe هي حاوية DI خفيفة الوزن من Microsoft. تستخدم المزينات والحل التلقائي عبر المُنشئ. مثالية للمشاريع المتوسطة والصغيرة.



التثبيت

npm install tsyringe reflect-metadata --save


إعداد tsconfig.json مشابه لـ InversifyJS.



مثال على الاستخدام

import { container, injectable, singleton } from "tsyringe";import "reflect-metadata";

// تسجيل الفئة كمفردة (singleton)@singleton()class DatabaseConnection { connect(): void { console.log("تم إنشاء الاتصال بقاعدة البيانات"); }}

// فئة مع حقن تبعية تلقائي@injectable()class UserRepository { constructor(private db: DatabaseConnection) {}

save(user

توصيات