Dependency Injection là gì?
Dưới đây là những khái niệm liên quan đến Dependency Injection là gì đã được nhiều chuyên gia lý giải mà bạn có thể tham khảo. Theo nguồn Wikipedia thì Dependency Injection được hiểu là một kỹ thuật, theo đó thì một đối tượng sẽ cung cấp các phụ thuộc của đối tượng khác. Mỗi một phụ thuộc chính là đối tượng có khả năng được sử dụng.
Định nghĩa Dependency Injection là gì?
Bên cạnh đó, các chuyên gia phân tích khác luôn xem xét khả năng hiểu về Dependency Injection của các kỹ thuật viên như sau: Dependency Injection là một kỹ thuật lập trình được định nghĩa như là khả năng hỗ trợ việc tách một class sao cho nó độc lập với các biến phụ thuộc khác. Tuy nhiên, nhiều người đã nhận thức rằng đây là một khái niệm khá phức tạp và thường không thể hiểu ngay lập tức khi đọc lần đầu.
Để giúp bạn hiểu rõ hơn về định nghĩa này, chúng ta hãy cùng nhau phân tích những đặc điểm tổng quan và thông thường nhất của Dependency Injection từ góc độ kỹ thuật. Dưới đây là sự phân tích về các phụ thuộc trong lập trình: Khi một lớp A sử dụng các chức năng của lớp B, điều này có nghĩa là lớp A phụ thuộc vào lớp B.
Trong ngôn ngữ lập trình Java, trước khi bạn có thể sử dụng các phương thức của một lớp khác, bạn cần tạo ra các đối tượng của lớp đó. Điều này đồng nghĩa với việc lớp A phải tạo ra một đối tượng mới của lớp B. Khi đó, việc chuyển trách nhiệm tạo đối tượng cho người khác và sử dụng trực tiếp một biến phụ thuộc được gọi là Dependency Injection.
Các loại của Dependency Injection là gì?
Hiện nay, đang có 3 loại Dependency Injection phổ biến là:
Loại 1: Constructor Injection: Những biến phụ này sẽ được cung cấp dựa vào một hàm tạo lớp mới.
Loại 2. Setter Injection: Client sẽ đưa ra một phương thức dạng setter mà khi đó Injector sẽ được sử dụng nhằm Dependency Injection.
Ví dụ về Dependency Injection
Loại 3. Interface Injection: Các biến phụ thuộc sẽ đưa một method mà để có thể đưa được biên này vào bất kỳ loại máy khách chạy ngang qua nào. Khi đó, máy khách cần phải triển khai một giao diện có chứa setter method để có thể chấp nhận cho các biến phụ thuộc.
Nhiệm vụ của Dependency Injection là gì?
Dependency Injection được tạo ra và sử dụng để giải quyết các nhiệm vụ như sau:
- Tạo các đối tượng
- Nắm bắt các đối tượng nào sẽ phù hợp với lớp nào.
- Thực hiện cung cấp cho những lớp đó toàn bộ mọi đối tượng.
Nhiệm vụ của Dependency Injection là gì?
Các lợi ích và hạn chế khi sử dụng Dependency Injection là gì?
Dưới đây là những lợi ích cũng như hạn chế còn tồn tại của Dependency Injection mà bạn có thể tham khảo là:
Lợi ích mang lại của Dependency Injection là gì?
- Thực hiện hỗ trợ kiểm tra Unit
- Giảm boiler plate code do việc tạo ra các biến phụ thuộc đã được injector thực hiện.
- Bạn có thể thực hiện dễ dàng các mở rộng cho ứng dụng.
- Dependency Injection hỗ trợ kích hoạt những kết nối cần thiết chặt chẽ hơn. Mà đây chính là một trong những yếu tố đặc biệt quan trọng trong lập trình ứng dụng.
Những hạn chế còn tồn tại của DI
Ngoài những điểm mạnh trên thì việc sử dụng Dependency Injection vẫn còn tồn tại các mặt hạn chế như:
- Đây là kỹ thuật khá phức tạp khi đòi hỏi sử dụng, nếu như bạn làm dụng Dependency Injection thì có thể dẫn đến lỗ hổng liên quan đến vấn đề quản lý và một số vấn đề có liên quan khác.
- Thường sẽ có nhiều lỗi liên quan đến thời gian biên dịch có thể bị đẩy vào run-time.
- Các DI framework sẽ được triển khai tương phản hoặc thực hiện lập trình động. Hoạt động này sẽ giúp bạn có thể cản trở việc sử dụng IDE tự động. Điều này có nghĩa như, khi bạn “tìm tài liệu tham khảo”, “hiển thị phân cấp cuộc gọi” hoặc thực hiện tái cấu trúc an toàn. Bởi vậy, bạn hoàn toàn có thể triển khai Dependency Injection riêng của chính mình hoặc sử dụng những thư viện Framework của bên thứ ba khác.
- Khó khăn lớn nhất với những người mới vào làm bằng DI sẽ không thể hiểu rõ được tư tưởng của nó. Điều này làm cho quá trình làm Dependency Injection sẽ bị nhập nhằng và các injector bị ràng buộc mà không thể thoát hẳn ra dựa theo chính tư tưởng của DI.
Các thư viện và Framework có thể triển khai DI
Bạn có thể sử dụng, áp dụng các Framework cũng như thư viện sau đây để có thể triển khai Dependency Injection:
Dependency Injection được nhiều lập trình viên sử dụng
Tại sao cần sử dụng Dependency Injection? Khi nào thì dùng và nên thực hiện nó ra sao?
Bạn có thể thực hiện Dependency Injection dựa trên các nguyên tắc như sau:
- Những class này không quá phụ thuộc trực tiếp lẫn nhau mà thay vào đó là chúng sẽ liên kết với nhau thông qua một Interface hoặc base Class (điều này đối với những ngôn ngữ không được hỗ trợ Interface).
- Việc thực hiện khởi tạo các Class thì đều sẽ cho các Interface quản lý thay cho những class phụ thuộc vào nó.
Ví dụ: Giả sử bạn có một Class Car và trong đó có vài object khác như Wheel hay Battery, thì ta sẽ có:
class Car{ private Wheels wheel = new MRFWheels(); private Battery battery = new ExcideBattery(); …. ….} |
Ở đây thì class Car sẽ chịu trách nhiệm thực hiện khởi tạo tất cả các dependencyobject. Nhưng chuyện gì sẽ xảy ra nếu như bạn muốn bỏ MRFWheels và thay thế chúng bằng BMWWheels. Vào lúc này, chúng ta cần phải tạo lại những đối tượng car với các phụ thuộc mới chính là BMWWheels.
Sau này nữa, nếu bạn muốn độ bánh xe lên thay vì các bánh khác thì sẽ ra sao. Nếu như bạn thêm một loạt code và khi đó chưa chắc chạy được bởi vì việc này hoàn toàn rất khó nhọc. Dependency Injection được xem là một trong những dạng Design Pattern được thiết kế giúp ngăn chặn những sự phụ thuộc mà chúng tôi đã nêu ở phần trên.
Bởi vì chúng ta thay đổi được Wheel ở runtime do dependency có truyền được vào ở runtime thay cho compile time. Điều này có thể giúp giảm các chi phí khi sửa đổi cũng như nâng cấp cho hệ thống. Vậy nên, khi bạn thực hiện thay đổi cho một class A thì những class có chứa biến kiểu class A sẽ không cần phải thay đổi theo.
Bạn có thể hiểu như sau: Dependency Injection chính là người trung gian có trách nhiệm tạo ra những loại wheel khác nhau rồi cung cấp chúng cho class car. Việc này sẽ làm cho class Car không cần phải quá phụ thuộc vào bất kỳ một wheels hoặc Battery cụ thể nào nữa.
Tổng kết
Dưới đây là những thông tin liên quan đến Dependency Injection mà chúng tôi đã tổng hợp. Hy vọng rằng, bài viết sẽ hỗ trợ lập trình viên khi họ tích hợp Dependency Injection vào công việc của mình. Trước khi bắt đầu làm quen với Dependency Injection, bạn nên nắm vững khái niệm này để tránh những sai lầm không đáng có.