Tiếp cận Dagger 2 với 3 dòng code

Tram Ho

Trong lập trình, chúng ta luôn muốn tìm các phương thức tốt nhất để refactor code để chúng ngày càng đơn giản hơn nữa.
Bài viết này sẽ chỉ ra một cách đơn giản hơn để giải thích Dagger 2. Bạn có thể coi nó như là một hướng dẫn nhanh về Dagger 2.

Chỉ với 3 dòng code

Để làm cho Dagger 2 có thể hoạt động, chúng ta sẽ chỉ cần 3 dòng code này

Chỉ cần thêm những dòng code này với bất kỳ file Kotlin nào trong project của bạn, và click nút ▶️ ở bên cạnh method fun main(), và nó sẽ được thực thi.

Ghi chú: Bạn sẽ cần include thư viện trước tiên trong file build.gradle

Phần đặc biệt của Dagger 2

Từ 3 dòng code ở trên, bạn sẽ nhìn thấy 3 unique chỉ định đặc biệt của Dagger 2, như giải thích ở dưới đây.

@Inject constructor()

Đây là phần mà nó chỉ ra cho Dagger 2 để tự động xây dựng đối tượng này.

@Component interface

Đây là phần mà nó chỉ ra cho Dagger 2 để implement giao diện (trong trường hợp của chúng ta là MagicBox) sẽ có code được generates và xây dựng tất cả các injectable dependency. Việc thực hiện được đặt tên là DaggerMagicBox.

Để có code chi tiết, bạn có thể tham khảo tại đây
3 lines of Working Dagger 2 Example Code

DaggerMagicBox.create()

Như đã đề cập trong mục trên, DaggerMagicBox được auto-generated implementation của @component interface đã được khai báo. Nó có function create() được tạo khởi tạo việc thực hiện này. Từ đó, chúng ta có thể trích xuất đối tượng phụ thuộc một cách dễ dàng.

Từ trên, chúng ta thấy rằng Dagger 2 tự động tạo đối tượng Info thông qua lớp container DaggerMagicBox.

Làm thế nào tôi có thể tự động inject dependency của tôi?

Đoạn code ta có ở trên có vẻ không giống như một Dependency Injection pattern, nhưng thay vào đó là một Service Locator pattern, như fun main() cần lấy đối tượng Info từ DaggerMagicBox. Điều này tương tự với việc đặt nó thành một biến như dưới đây.

Nhưng cái chúng ta muốn là auto-injection, như là đoạn code Dagger 2 bên duowis:

Để đạt được điều này, chúng ta chỉ cần thực hiện một số công việc bổ sung ngoài 3 dòng code ở trên.

1. Tạo một class mục tiêu để chứa sự phụ thuộc

Ở đoạn code bên trên, chúng ta cần lateinit var bởi vì biến đó không được biết trong quá trình xây dựng lớp đối tượng.

2. Thay thế thành phần val bằng function để inject đối tượng đích

Thay đổi đoạn code dưới đây:

Từ đó, nó thông báo tới các thành phần, thay vì có cách tạo Info trong chính MagicBox. Nó có thể inject the dependencies (ví dụ như Info) ở trong đối tượng target class (ví dụ MainClass) khi function poke được gọi.

3. Inject the dependencies ở trong một target class

Cuối cùng, chỉ cần khởi tạo DaggerMagicBox trong target class, và yêu cầu nó inject các dependencies cần thiết (sử dụng function poke), như ví dụ bên dưới.

Với ở trên, toàn bộ code trông như dưới đây.

Nói tóm lại, ưu điểm của Dagger 2 nằm ở đằng sau việc tự động tạo đối tượng DaggerMagicBox, đó là việc implementation MagixBox interface.


Hy vọng bài viết này sẽ giúp ích được nhiều cho các bạn.

Nguồn tham khảo: https://levelup.gitconnected.com/even-simpler-dagger-2-tutorial-9691c9bf2c05

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo