في NestJS، موفر (provider) هو أي فئة يمكن حقنها كتبعية، وخدمة (service) هي النوع الأكثر شيوعاً — فئة تحتوي على منطق العمل. وضع علامة على فئة بـ @Injectable() يجعلها موفراً يمكن لنظام حقن التبعيات في NestJS إنشاؤه وحقنه.
في NestJS، موفر (provider) هو أي فئة يمكن حقنها كتبعية، وخدمة (service) هي النوع الأكثر شيوعاً — فئة تحتوي على منطق العمل. وضع علامة على فئة بـ @Injectable() يجعلها موفراً يمكن لنظام حقن التبعيات في NestJS إنشاؤه وحقنه.
import { Injectable } from "@nestjs/common";
@Injectable() // marks the class as a provider (injectable)
export class UsersService {
private users = [];
findAll() { return this.users; } // business logic
findOne(id: string) { return this.users.find(u => u.id === id); }
create(data) { this.users.push(data); return data; }
}
مُزخرِف @Injectable() يخبر NestJS أن هذه الفئة تشارك في حقن التبعيات — يمكن حقنها في المتحكمات أو موفرين آخرين.
@Controller("users")
export class UsersController {
// NestJS sees this parameter and INJECTS a UsersService instance automatically
constructor(private usersService: UsersService) {}
@Get()
findAll() {
return this.usersService.findAll(); // use the injected service
}
}
تصرح بالتبعية كمعامل في مُنشئ البناء؛ ينشئ NestJS ويوفر النسخة — لا تكتب أبداً new UsersService().
@Module({
controllers: [UsersController],
providers: [UsersService], // register the provider so DI can resolve it
exports: [UsersService], // make it available to OTHER modules that import this one
})
export class UsersModule {}
يجب تسجيل الموفرين في مصفوفة providers الخاصة بالوحدة ليعرف نظام حقن التبعيات عنهم، وexports تشاركهم مع وحدات أخرى.
By default, NestJS creates ONE shared instance of each provider (singleton scope)
for the whole application → efficient, shared state.
(Other scopes exist: REQUEST-scoped, TRANSIENT — but singleton is the default.)
Controller → handles HTTP (routing, request/response)
Service → handles business logic (rules, data access, computations)
→ Separation makes logic REUSABLE (multiple controllers can use one service),
TESTABLE (test the service in isolation), and ORGANIZED.
الموفرون والخدمات هي أساس معمارية NestJS وتصميمها القائم على حقن التبعيات. الخدمات تحتفظ بـ منطق العمل الخاص بالتطبيق، مفصولة عن المتحكمات (التي تتعامل فقط مع اهتمامات HTTP) — هذا الفصل بين الاهتمامات يجعل المنطق قابلاً لإعادة الاستخدام عبر المتحكمات، وسهل الاختبار في العزلة، وجيد التنظيم.
فهم أن @Injectable() تحدد فئة كموفر قابل للحقن، أن الموفرين يتم تسجيلهم في الوحدات وحقنهم عبر مُنشئات البناء (حقن التبعيات ينشئ النسخ لك)، وأنهم singletons بشكل افتراضي هو معرفة أساسية يومية في NestJS.
نمط الموفر/الخدمة، بالاقتران مع المتحكمات والوحدات، هو العمود الفقري لكل تطبيق NestJS — إتقانه ضروري لبناء أنظمة خلفية جيدة التنظيم وقابلة للصيانة وهو من بين المفاهيم الأولى التي يجب تعلمها في الإطار العمل.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع