Khác nhau ở khả năng dùng dependency injection.
app.useGlobalFilters(new AllExceptionsFilter()) chạy bên ngoài mọi module context, nên bạn phải tự new instance và tự truyền dependency. Filter đó không inject được LoggerService, ConfigService...
Đăng ký qua token APP_FILTER trong providers của một module thì filter nằm trong IoC container, inject bình thường — mà vẫn có phạm vi global:
ts
@Module({
providers: [
{ provide: APP_FILTER, useClass: AllExceptionsFilter },
],
})
export class AppModule {}ts
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
constructor(private readonly logger: LoggerService) {} // works only with APP_FILTER
catch(exception: unknown, host: ArgumentsHost) { /* ... */ }
}Quy tắc này áp dụng chung cho APP_GUARD, APP_INTERCEPTOR, APP_PIPE.
Lưu ý: đăng ký ở module nào cũng thành global, và có thể khai báo nhiều provider APP_FILTER — chúng được cộng dồn chứ không ghi đè nhau.