+3

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

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

class Info @Inject constructor()
@Component interface MagicBox { val info: Info }
fun main() { println(DaggerMagicBox.create().info) }

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

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // ... other dependencies ...
    implementation 'com.google.dagger:dagger:2.13'
    kapt 'com.google.dagger:dagger-compiler:2.13'
}

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 interface (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.

val myInfo = DaggerMagicBox.create().info

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

@Inject lateinit var myInfo: Info

Để đạ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

class MainClass {
    @Inject lateinit var info : Info
}

Ở đ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:

// Remove this line and replace with the one with `poke`
// @Component interface MagicBox { val info: Info2 } 
@Component interface MagicBox { fun poke(myTarget: MainClass) }

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.

class MainClass {
    @Inject lateinit var info : Info
    init { DaggerMagicBox.create().poke(this) }
}

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

class MainClass {
    @Inject lateinit var info : Info
    init { DaggerMagicBox.create().poke(this) }
}
class Info @Inject constructor()
@Component interface MagicBox { fun poke(mainClass: MainClass) }
fun main() { println(MainClass().info) }

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


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí