DependencyInjection
Dependency Inversion, Inversion of Control (IoC), Dependency Injection(DI). Ba khái niệm này tương tự nhưng không hoàn toàn giống nhau.
Dependency Inversion: Là một nguyên lý để thiết kế và viết code.
Inversion of Control: Là một Design Pattern được tạo ra để tuân thủ nguyên lý Dependency Inversion. Có nhiều cách hiện thực pattern này: ServiceLocator, Event, Delegate...Dependecy Injection là một cách đó.
Dependency Injection: Là một cách hiện thực IoC.
Hiểu về DI:
Các module không giao tiếp trực tiếp với nhau, mà thông qua interface. Module cấp thấp sẽ implement interface, module cấp cao sẽ gọi module cấp thấp thông qua interface. Ví dụ: Để giao tiếp với database, ta có interface IDatabase, các module cấp thấp là XMLDatabase, SQLDatabase. Module cấp cao là CustomerBusiness sẽ chỉ sử dụng interface IDatabase.
Việc khởi tạo các module cấp thấp sẽ do DI Container thực hiện.Ví dụ: Trong module CustomerBusiness, ta sẽ không khởi tạo IDatabase db = new XMLDatabase(), việc này sẽ do DI Container thực hiện. Module CustomerBusiness sẽ không biết gì về module XMLDatabase hay SQLDatabase.
Việc Module nào gắn với interface nào sẽ được config trong code hoặc trong file XML.
DI được dùng để làm giảm sự phụ thuộc giữa các module, dễ dàng hơn trong việc thay đổi module, bảo trì code và testing.
Các dạng DI
Có 3 dạng:
Constructor Injection: Các dependency sẽ được container truyền vào (inject vào) 1 class thông qua constructor của class đó. Đây là cách thông dụng nhất.
Setter Injection: Các dependency sẽ được truyền vào 1 class thông qua các hàm Setter.
Interface Injection: Class cần inject sẽ implement 1 interface. Interface này chứa 1 hàm tên Inject. Container sẽ injection dependency vào 1 class thông qua việc gọi hàm Inject của interface đó. Đây là cách rườm rà và ít được sử dụng nhất.
* Giảm sự kết dính giữa các module * Code dễ bảo trì, dễ thay thế module * Rất dễ test và viết Unit Test * Dễ dàng thấy quan hệ giữa các module (Vì các dependecy đều được inject vào constructor)
* Khái niệm DI khá “khó tiêu”, các developer mới sẽ gặp khó khăn khi học * Sử dụng interface nên đôi khi sẽ khó debug, do không biết chính xác module nào được gọi * Các object được khởi tạo toàn bộ ngay từ đầu, có thể làm giảm performance * Làm tăng độ phức tạp của code
Last updated