FresherKỹ thuậtAngular
Dependency injection trong Angular là gì và tại sao được dùng?
Thử trả lời trước
Đáp án mẫu
Dependency injection (DI) nghĩa là class không tự tạo những thứ nó phụ thuộc. Nó yêu cầu chúng, và injector của Angular tạo rồi cung cấp. Class khai báo nó cần gì, còn framework quyết định cách dựng.
@Injectable({ providedIn: 'root' })
export class Logger {
log(message: string) {
console.log(message)
}
}
@Component({ selector: 'app-home', template: `<p>Home</p>` })
export class Home {
private logger = inject(Logger)
constructor() {
this.logger.log('Home created')
}
}
providedIn: 'root' đăng ký một instance dùng chung (singleton) cho cả app, và service không dùng đến có thể bị loại khỏi bundle (tree-shaking).
DI được dùng vì nó:
- Tránh các lời gọi
newcứng, nên các class liên kết lỏng với nhau. - Giúp test dễ, vì bạn có thể thay service bằng bản giả.
- Cho phép kiểm soát phạm vi: toàn app, theo route hoặc theo component.
Code cũ inject qua tham số constructor, cách đó làm cùng một việc.
Hãy yêu cầu dependency thay vì tự tạo chúng.
Ý chính
- Class yêu cầu dependency; injector cung cấp
- providedIn root tạo một singleton dùng chung
- DI giúp test và thay implementation dễ dàng
- Phạm vi có thể là app, route hoặc component
Câu hỏi nối tiếp thường gặp
- Chuyện gì xảy ra nếu Angular không tìm thấy provider cho một service?
Lỗi thường gặp
- Tạo service bằng new thay vì inject
- Quên Injectable và provider nên inject bị lỗi