Dependency Injection Scope
Penjelasan
Secara default, Provider (Service) di NestJS bersifat SINGLETON (@Injectable() biasa) — satu instance dipakai bersama SELURUH aplikasi. Untuk kasus khusus, scope bisa diubah lewat argumen @Injectable({ scope: Scope.REQUEST }) (instance baru per request masuk) atau Scope.TRANSIENT (instance baru tiap kali di-inject ke consumer berbeda).
Contoh Konsep
import { Injectable, Scope } from '@nestjs/common';
@Injectable({ scope: Scope.DEFAULT }) // singleton, default kalau tidak ditulis apa-apa
export class ProdukService {}
@Injectable({ scope: Scope.REQUEST }) // instance baru tiap request HTTP masuk
export class RequestLoggerService {
private waktuMulai = Date.now();
getDurasi() {
return Date.now() - this.waktuMulai;
}
}
Praktikum
Buat AuditService dengan scope Scope.REQUEST, punya properti idRequest yang diisi lewat crypto.randomUUID() di constructor-nya (unik tiap request). Jelaskan (sebagai komentar) kenapa scope singleton biasa TIDAK cocok untuk kasus ini.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Scope.REQUEST dan Scope.TRANSIENT punya BIAYA PERFORMA (instance baru dibuat berulang-ulang) dibanding singleton default — pakai HANYA kalau benar-benar butuh state yang unik per request/consumer (mis. logging context per request), untuk kebanyakan Service biasa, singleton default sudah tepat dan lebih cepat.