Study
NestJS

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.

Editor Latihan

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.