- Dependency Injection là gì?
Dependency Injection (DI), hay tiêm phụ thuộc, là kỹ thuật cung cấp những đối tượng hoặc thành phần mà một đối tượng cần sử dụng từ bên ngoài, thay vì để đối tượng đó tự tạo ra tất cả những thành phần cần thiết.
Để hiểu đơn giản, hãy tưởng tượng một nhân viên cần máy tính để làm việc. Thay vì tự sản xuất máy tính, nhân viên được công ty cung cấp máy tính để sử dụng. Trong lập trình, một lớp cũng có thể được cung cấp những đối tượng cần thiết theo cách tương tự.
Ví dụ, một ứng dụng Flutter có chức năng lấy danh sách sản phẩm từ máy chủ. Lớp xử lý sản phẩm cần sử dụng một đối tượng API Client để gửi yêu cầu HTTP. Thay vì tự tạo API Client bên trong lớp đó, chúng ta có thể truyền API Client vào từ bên ngoài. Đây là cách áp dụng Dependency Injection.
- Dependency Injection hoạt động như thế nào?
Thông thường, một lớp có thể tự tạo đối tượng mà nó cần sử dụng. Cách làm này có thể khiến các lớp phụ thuộc chặt chẽ vào nhau, gây khó khăn khi thay đổi hoặc kiểm thử.
Với Dependency Injection, các thành phần cần thiết được tạo ở một nơi phù hợp rồi truyền vào đối tượng sử dụng chúng. Nhờ đó, việc khởi tạo đối tượng và việc xử lý nghiệp vụ được tách biệt rõ ràng hơn.
Ví dụ, quy trình có thể là:
Khởi tạo API Client → Truyền API Client vào lớp quản lý sản phẩm → Lớp quản lý sản phẩm sử dụng API Client để lấy dữ liệu → Giao diện nhận kết quả và hiển thị
Trong Flutter, Dependency Injection có thể được thực hiện thông qua constructor, Provider, Riverpod hoặc những công cụ chuyên dụng khác (như get_it, injectable).
- Ví dụ minh họa
Định nghĩa các lớp dịch vụ và lưu trữ:
class ProductService {
void getProducts() {
print('Đang lấy danh sách sản phẩm');
}
}
class ProductRepository {
final ProductService service;
ProductRepository(this.service);
void loadProducts() {
service.getProducts();
}
}
Trong ví dụ này, ProductRepository cần ProductService để thực hiện công việc. Thay vì tự tạo ProductService bên trong lớp, đối tượng này được truyền vào thông qua constructor ProductRepository(this.service).
Khi khởi tạo và sử dụng:
final service = ProductService();
final repository = ProductRepository(service);
repository.loadProducts();
Như vậy, ProductRepository không cần tự chịu trách nhiệm tạo ProductService. Khi cần thay đổi cách lấy dữ liệu hoặc kiểm thử, chúng ta có thể cung cấp một đối tượng khác có cùng giao diện phù hợp.
- Lợi ích của Dependency Injection
Dependency Injection giúp giảm sự phụ thuộc chặt chẽ giữa các thành phần (low coupling), hỗ trợ tái sử dụng mã nguồn và giúp kiểm thử (unit test) dễ dàng hơn. Ví dụ, khi kiểm thử chức năng lấy sản phẩm, chúng ta có thể truyền vào một đối tượng giả lập (mock object) thay vì phải gọi máy chủ thật.
- Kết luận
Dependency Injection là kỹ thuật cung cấp các thành phần cần thiết từ bên ngoài cho đối tượng sử dụng chúng. Trong Flutter, kỹ thuật này giúp tổ chức mã nguồn rõ ràng, giảm sự phụ thuộc giữa các lớp và thuận tiện hơn khi bảo trì, mở rộng hoặc kiểm thử ứng dụng.




Khoá học lập trình game con rắn cho trẻ em




