Dependency Inversion khác gì Dependency Injection

Anh PhanAnh Phan
2 min read

Đây là câu hỏi đau đầu trong các buổi phỏng vấn. Trong bài viết nói chúng ta sẽ tìm hiểu xem chúng khác gì nhau

Dependency là gì?

Có một số loại phụ thuộc, bao gồm:

  • usage: thông dụng nhất, 1 class này dùng class khác bên trong nó

  • binding: class được gán một field hoặc 1 function khác ở runtime

  • realization: class implement interface

  • substitution: class con extends class chaĐ

Dependency Inversion Principle

Nguyên lý Dependency Inversion có thể đạt được bằng nhiều cách và Dependency Injection chỉ là 1 pattern có thể giúp thoả mãn nguyên lý này.

Ví dụ tôi có một RemoteControl chứa 1 field là Television

Vậy thì đây là sự phụ thuộc thông thường. Bây giờ đến lúc phù phép rồi:

Xong, giờ thì RemoteControl đã không còn phụ thuộc vào Television. Mà cả 2 cùng phụ thuộc vào 1 abstraction là OnOffDevice. Và ở đây chưa hề có Dependency Injection, nó sẽ không nói đến là ta có cần inject cái OnOffDevice (abstract class hoặc interface) vào RemoteControl không

nhưng mà cũng có thể dùng Factory mà, ví dụ dùng như này cũng là Dependency Inversion rồi:

public class RemoteControl {
   public RemoteControl() {
    this.OnOffDevice = OnOffDeviceFactory.Create()
   }
}

Dependency Injection Pattern

Tương tự, bạn có thể thoả mãn pattern dependency injection mà không sử dụng nguyên lý dependency inversion. RemoteControl depend trực tiếp vào Implementation:

public class RemoteControl {
  public RemoteControl(Television television) {
    _television = television;
  }
}

Tada, vậy là chúng ta đã phân biệt được 2 thứ khó chịu này. Hẹn gặp lại các bạn.

0
Subscribe to my newsletter

Read articles from Anh Phan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Anh Phan
Anh Phan