W NestJS provider to dowolna klasa, którą można wstrzyknąć jako zależność, a serwis to najczęstszy rodzaj — klasa zawierająca logikę biznesową. Oznaczenie klasy @Injectable() czyni ją providerem, który system DI NestJS może utworzyć i wstrzyknąć.
W NestJS provider to dowolna klasa, którą można wstrzyknąć jako zależność, a serwis to najczęstszy rodzaj — klasa zawierająca logikę biznesową. Oznaczenie klasy @Injectable() czyni ją providerem, który system DI NestJS może utworzyć i wstrzyknąć.
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; }
}
Dekorator @Injectable() mówi NestJS, że ta klasa uczestniczy w dependency injection — można ją wstrzyknąć do kontrolerów lub innych providerów.
@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
}
}
Deklarujesz zależność jako parametr konstruktora; NestJS tworzy i dostarcza instancję — nigdy nie piszesz 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 {}
Providerzy muszą być zarejestrowani w tablicy providers modułu, aby system DI o nich wiedział, a exports udostępnia je innym modułom.
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.
Providerzy i serwisy to jądro architektury NestJS i jego projektowania opartego na dependency injection.
Serwisy zawierają logikę biznesową aplikacji, oddzieloną od kontrolerów (które zajmują się tylko kwestiami HTTP) — ta separacja zagadnień czyni logikę ponownie używalną w wielu kontrolerach, łatwo testowaną w izolacji i dobrze zorganizowaną.
Zrozumienie, że @Injectable() oznacza klasę jako injectedwalny provider, że providerzy są rejestrowani w modułach i wstrzykiwani przez konstruktory (system DI tworzy dla ciebie instancje), oraz że domyślnie są singletonami, to fundamentalna, codzienną wiedzę o NestJS.
Wzorzec provider/serwis, w połączeniu z kontrolerami i modułami, to kręgosłup każdej aplikacji NestJS — opanowanie go jest niezbędne do budowania dobrze strukturowanych, łatwych w utrzymaniu zaplecz systemów i należy do pierwszych koncepcji do nauczenia się w tym frameworku.