Dependency Injection

by DangDo
415 views

Dependency Injection là một mẫu thiết kế được sử dụng để triển khai Inversion of Control. Nó cho phép tạo các đối tượng phụ thuộc bên ngoài một lớp và cung cấp các đối tượng đó cho một lớp thông qua các cách khác nhau. Sử dụng DI, chúng ta di chuyển việc tạo và ràng buộc các đối tượng phụ thuộc ra bên ngoài lớp phụ thuộc vào chúng. Điều này mang lại mức độ linh hoạt cao hơn, phân tách và kiểm tra dễ dàng hơn.

Khi mà class A sử dụng một số chức năng của class class B, thì có thể nói là class A có quan hệ phụ thuộc với class B.

Trong java, trước khi ta có thể sử dụng method của class khác, ta phải khởi tạo một đối tượng của class đấy.

Tại sao cần sử dụng Dependency Injection?

Ví dụ chúng ta có một class Car, trong đó có chứa đối tượng khác như Wheel.

Ở đây, class Car chịu trách nhiệm khởi tạo tất cả các dependency object. Nhưng chuyện gì sẽ xảy ra nếu chúng ta muốn bỏ Wheel và thay thế bằng SteelWheel hoặc PlasticWheel.

Để giải quyết vấn đề trên thì chúng ta phải tạo một class Car mới với SteelWheel hoặc PlasticWheel. Tuy nhiên khi sử dụng dependency injection, chúng ta có thể đổi Wheel trong thời gian chương trình chạy (Runtime) vì dependency có thể được đẩy vào ở Runtime thay vì Compiletime.

Có 3 loại Dependency Injection

  1. Constructor injection: Các dependency được cung cấp thông qua constructor của class.
  2. Setter Injection: Khách hàng tạo ra một setter method để các class khác có thể sử dụng chúng để cấp dependency.
  3. Interface injection: Dependency sẽ cung cấp một hàm injector để inject nó vào bất kỳ khách hàng nào được truyền vào. Các khách hàng phải implement một interface mà có một setter method dành cho việc nhận dependency.

Trách nhiệm của dependency injection là:

  1. Tạo ra các object.
  2. Biết class nào cần object đấy.
  3. Cung cấp cho những class đó object chúng cần.

Bằng cách này, nếu trong tương lai object đó có sự thay đổi thì dependency injection có nhiệm vụ cấp lại những object cần thiết cho class.

Điểm mạnh

  1. Giúp unit test dễ hơn.
  2. Giảm thiểu được code mẫu (boilerplate code) vì việc khởi tạo dependency được làm bởi một component khác.
  3. Mở dụng dự án dễ dàng hơn.
  4. Giúp ích trong việc liên kết lỏng giữa các thành phần trong dự án

Điểm yếu

  1. Khá phức tạp để học.
  2. Rất nhiều các lỗi ở compile time có thể đẩy sang runtime.
  3. Có thể làm ảnh hường tới chức năng auto-complete hay Find references của một số IDE.

Nguồn tham khảo:

  1. https://viblo.asia/p/dependency-injection-la-gi-va-khi-nao-thi-nen-su-dung-no-LzD5d0d05jY

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

You may also like