Mục lục nội dung
Chuẩn bị
Trước khi khởi đầu mình muốn những bạn tìm hiểu và khám phá qua về SOLID principles đó là những nguyên tắc phong cách thiết kế và viết code. Sau đó ở đây mình sẽ chỉ nhấn mạnh vấn đề nguyên tắc ở đầu cuối SOLID đó chính là Dependency Inversion :
Dependency inversion principle
Bạn đang đọc: DAGGER LÀ GÌ
1. Các module cấp cao không nên phụ thuộc vào vào những modules cấp thấp. Cả 2 nên nhờ vào vào abstraction. 2. Interface ( abstraction ) không nên nhờ vào vào chi tiết cụ thể, mà ngược lại. ( Các class tiếp xúc với nhau trải qua interface, không phải trải qua implementation. ) Với cách code thường thì, những module cấp cao sẽ gọi những module cấp thấp. Module cấp cao sẽ phụ thuộc vào và module cấp thấp, điều đó tạo ra những dependency. Khi module cấp thấp biến hóa, module cấp cao phải biến hóa theo. Một biến hóa sẽ kéo theo hàng loạt đổi khác, giảm năng lực bảo dưỡng của code. Chính thế cho nên nêú tuân theo Dependendy Inversion principle, những module cùng nhờ vào vào 1 interface không đổi. Ta hoàn toàn có thể thuận tiện thay thế sửa chữa, sửa đổi module cấp thấp mà không ảnh hưởng tác động gì tới module cấp cao .Bạn đang xem : Dagger là gìĐịnh nghĩa và khái niệm DIHiện nay, các lập trình viên hay lẫn lộn giữa các khái niệm Dependency Inversion, Inversion of Control (IoC), Dependency Injection (DI). Ba khái niệm này tương tự nhau nhưng không hoàn toàn giống nhau.Hiện nay, những lập trình viên hay lẫn lộn giữa những khái niệm Dependency Inversion, Inversion of Control ( IoC ), Dependency Injection ( DI ). Ba khái niệm này tương tự như nhau nhưng không trọn vẹn giống nhau .Dependency Inversion: Đây là một nguyên lý để thiết kế và viết code.Inversion of Control: Đây là một design pattern được tạo ra để code có thể tuân thủ nguyên lý Dependency Inversion. Có nhiều cách hiện thực pattern này: ServiceLocator, Event, Delegate, … Dependency Injection là một trong các cách đó.Dependency Injection: Đây là một cách để hiện thực Inversion of Control Pattern (Có thể coi nó là một design pattern riêng cũng được). Các module phụ thuộc (dependency) sẽ được inject vào module cấp cao.Sự độc lạ giữa 3 khái niệm trên : Đây là một nguyên tắc để phong cách thiết kế và viết code. Đây là một design pattern được tạo ra để code hoàn toàn có thể tuân thủ nguyên tắc Dependency Inversion. Có nhiều cách hiện thực pattern này : ServiceLocator, Event, Delegate, … Dependency Injection là một trong những cách đó. Đây là một cách để hiện thực Inversion of Control Pattern ( Có thể coi nó là một design pattern riêng cũng được ). Các module phụ thuộc vào ( dependency ) sẽ được inject vào module cấp cao .
Xem thêm: Giải Đáp Thắc Mắc Kích Thước Trứng Nhỏ Có Rụng Được Không ? Chỉ Mất Vài Giây Nhận Ngay Kết Quả!
Có thể hiểu Dependency Injection một cách đơn giản như sau:
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.Các module không tiếp xúc trực tiếp với nhau, mà trải qua interface. Module cấp thấp sẽ implement interface, module cấp cao sẽ gọi module cấp thấp trải qua interface .Ví dụ : Để tiếp xúc với database, ta có interface IDatabase, những 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 những module cấp thấp sẽ do DI Container thực thi. 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 thi. 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ự nhờ vào giữa những module, thuận tiện hơn trong việc đổi khác module, bảo dưỡng code và testing .
Dependency Injection with Dagger 2
Dagger 2 là gì ?Là một dependency injector, khác với các dependency injector dành cho việc triển khai ứng dụng Enterprise như Spring IoC hay JavaEE CDI. Dagger Được thiết kế cho các thiết bị low-end, nhỏ gọn nhưng vẫn đầy đủ tính năng.Hầu hết các dependency injector sử dụng reflection để tạo ra và inject các module. Reflection nhanh và thích hợp cho các version Android cũ nhưng reflection gây ra khó khăn rất lớn trong việc debug hay tracking khi gặp lỗi.Thay bằng việc sử dụng reflection Dagger sử dụng một trình biên dịch trước (pre-compiler), trình biên dịch này tạo ra tất cả các lớp, các module cần thiết để làm việc.Dagger ít mạnh mẽ so với các dependency injector khác nhưng thay vào đó Dagger lại nhẹ nhàng và dễ dàng sử dụng cũng như gần như bỏ đi được điểm yếu của dependency injector là khả năng tracking bugDagger 2 sử dụng chủ yếu các anotation sau :Là một dependency injector, khác với những dependency injector dành cho việc tiến hành ứng dụng Enterprise như Spring IoC hay JavaEE CDI. Dagger Được phong cách thiết kế cho những thiết bị low-end, nhỏ gọn nhưng vẫn rất đầy đủ tính năng. Hầu hết những dependency injector sử dụng reflection để tạo ra và inject những module. Reflection nhanh và thích hợp cho những version Android cũ nhưng reflection gây ra khó khăn vất vả rất lớn trong việc debug hay tracking khi gặp lỗi. Thay bằng việc sử dụng reflection Dagger sử dụng một trình biên dịch trước ( pre-compiler ), trình biên dịch này tạo ra tổng thể những lớp, những module thiết yếu để thao tác. Dagger ít can đảm và mạnh mẽ so với những dependency injector khác nhưng thay vào đó Dagger lại nhẹ nhàng và thuận tiện sử dụng cũng như gần như bỏ đi được điểm yếu của dependency injector là năng lực tracking bugDagger 2 sử dụng hầu hết những anotation sau :
Định nghĩa dependency providers (object providers)
Xem thêm: Neocortex là gì
Trong Dagger 2 class có anotation
Module có trách nhiệm cung cấp các object có thể được inject.Các class như vậy có thể định nghĩa các phương thức với anotated
Provides. Các đối tượng trả về từ các phương thức này có sẵn dependency để inject.Định nghĩa dependency (object consumers) Bạn có thể sử dụng
Inject với constructor,Dagger 2 có thể sử dụng 1 instance này để hoàn thành dependencies.Điều này được thực hiện để tránh việc define nhiều phương thức
Component được sử dụng trong 1 interface.Interface này được sử dụng bởi Dagger2 nhằm generate code, kết nối giữa module và đối tượng thể hiện sự phụ thuộc. Sau đây là bảng tổng quan cách sử dụnganotate trong dagger :Table 1. Annotation summary of Dagger 2
AnnotationUsage
ComponentUsed on an interface. This interface is used by Dagger 2 to generate code which uses the modules to fulfill the requested dependencies.
Note: Dagger không tự động inject các fields. Nó cũng không thể inject các private fields, nếu bạn muốn sử dụng inject field, bạn sẽ define 1 method trong
Component interface trong đó lấy instance mà bạn muốn inject làm tham số.
Kết luận
Qua bài viết này kỳ vọng toàn bộ những bạn hoàn toàn có thể tưởng tượng qua tư tưởng về Dependency injection, để từ đó có cái nhìn đến Dagger 2, sang bài tiếp theo mình sẽ triển khác những bước để inject dagger vào 1 project nhỏ android. Ở bài viết này mình đã cố gắng nỗ lực tìm hiểu thêm từ nhiều nguồn nhưng lượng kiến thức và kỹ năng hạn chế mong nhận được sự góp phần của những bạn. Cảm ơn mọi người !
Source: https://mindovermetal.org
Category: Wiki là gì