</>
⌕
Senior #scope#request-scope#performance#di

Provider scope DEFAULT, REQUEST, TRANSIENT khác gì nhau và ảnh hưởng hiệu năng ra sao?

⚡ Trả lời nhanh

DEFAULT là singleton dùng chung cả app. REQUEST tạo instance mới cho mỗi request, TRANSIENT tạo instance riêng cho mỗi consumer inject. Scope REQUEST có tính lan truyền lên mọi consumer của nó, tốn bộ nhớ và CPU, nên chỉ dùng khi thật cần.

ScopeVòng đờiChi phí
DEFAULT1 instance suốt appthấp nhất
REQUEST1 instance mỗi request, GC khi xongcao, lan truyền
TRANSIENT1 instance mỗi nơi injecttrung bình, không chia sẻ
@Injectable({ scope: Scope.REQUEST })
export class TenantService {
  constructor(@Inject(REQUEST) private req: Request) {}
}
  • Scope bubble up: controller phụ thuộc provider REQUEST cũng trở thành request-scoped, kéo theo cả chuỗi bị khởi tạo lại mỗi request.
  • Lifecycle hook như onModuleInit không chạy theo từng request-scoped instance.
  • Thay thế nhẹ hơn: AsyncLocalStorage (vd. nestjs-cls) giữ context theo request mà provider vẫn là singleton.
🃏 Ôn bằng flashcard