Dependency Injection là gì?
Theo Wikipedia, Dependency Injection là phương pháp kỹ thuật, trong đó một đối tượng cung cấp các phụ thuộc cho một đối tượng khác. Mỗi phụ thuộc là một đối tượng có khả năng sử dụng.
Dependency Injection là kỹ thuật hỗ trợ việc tách một class để nó trở nên độc lập với các biến phụ thuộc. Tuy nhiên, nó được nhận định là khá phức tạp và thường cần thời gian để học tập và nghiên cứu.
Trong Java, trước khi sử dụng các phương thức của một lớp, bạn cần tạo đối tượng của lớp đó. Dependency Injection giúp chuyển trách nhiệm tạo đối tượng cho người khác và sử dụng trực tiếp biến phụ thuộc.
Nhiệm vụ chính của Dependency Injection
Sau đây là các nhiệm vụ chính mà Dependency Injection (DI) đảm nhận:
- Xây dựng đối tượng.
- Xác định đối tượng nào phù hợp với từng lớp.
- Cung cấp toàn bộ các đối tượng cho các lớp đó.
- Theo dõi và xử lý các thay đổi trong đối tượng mà không ảnh hưởng đến các lớp đang sử dụng chúng. Giúp DI tập trung vào việc cung cấp đối tượng thích hợp cho các lớp đang sử dụng khi có thay đổi trong tương lai.
Dependency Injection còn thực hiện nguyên tắc “đảo ngược kiểm soát” Ám chỉ rằng một số lớp không nên được cấu hình thông qua các biến phụ tĩnh, thay vào đó, cần phải được cấu hình thông qua một số lớp khác từ bên ngoài. Đây là nguyên tắc quan trọng trong SOLID, gồm 5 nguyên tắc cơ bản liên quan đến lập trình hướng đối tượng.
Theo nguyên tắc này, lớp nên dựa vào abstraction thay vì concretions (mã hóa cứng), tập trung vào việc hoàn thành nhiệm vụ thay vì tạo ra các đối tượng để thực hiện nhiệm vụ đó.
Ưu điểm – Hạn chế của Dependency Injection
Ưu điểm:
- Thực hiện hỗ trợ kiểm thử đơn vị.
- Giảm bớt mã lặp boilerplate bằng cách để injector xử lý việc tạo các biến phụ thuộc.
- Dễ dàng mở rộng ứng dụng một cách thuận tiện.
- Dependency Injection cung cấp kết nối chặt chẽ hơn, điều này là một yếu tố quan trọng trong lập trình ứng dụng.
- Tạo cấu trúc rõ ràng và gia tăng tính module trong hệ thống giúp giảm sự rối loạn để đọc mã nguồn dễ dàng hơn.
Hạn chế
- Là một kỹ thuật khá phức tạp, đôi khi có thể gặp vấn đề quản lý, hoặc các vấn đến liên quan khác khi sử dụng. Các lỗi liên quan đến thời gian biên dịch có thể xuất hiện trong quá trình chạy ứng dụng.
- Các framework DI thường triển khai theo cách tương phản hoặc thực hiện lập trình động. Điều này ngăn chặn khả năng sử dụng các tính năng tự động của IDE như “tìm tài liệu tham khảo”, “hiển thị cây cuộc gọi” hoặc tái cấu trúc an toàn.
Cách cài đặt Dependency Injection
Bạn có thể xem sơ đồ dưới đây:
Trong đó:
- Service: Một class/ interface cung cấp dependency/ service cho Client.
- Client: Một class cần dùng service
- Injector: Một class có nhiệm vụ khởi tạo service và inject cho Client
- ServiceImpl: Cài đặt phương thức cụ thể cho Service
Kết luận
Trên đây là tổng hợp mọi thông tin bạn cần biết về Dependency Injection là gì? Cũng như sử dụng khi nào, ưu điểm nhược điểm và phân biệt với các Pattern khác. Hy vọng LANIT đã đem tới những thông tin hữu ích và đừng quên theo dõi LANIT để cập nhật nhiều nội dung công nghệ thú vị hơn nữa nhé!