📜  Android 中的 Dagger 2 @Inject 和 @Component 注解

📅  最后修改于: 2022-05-13 01:54:29.402000             🧑  作者: Mango

Android 中的 Dagger 2 @Inject 和 @Component 注解

Android 是一个基于 Linux 内核的开源操作系统,用于智能手机、平板电脑等移动设备。此外,它是为智能手表和 Android TV 开发的。他们每个人都有一个专门的接口。 Android 一直是最畅销的智能手机操作系统之一。 Android OS 由 Google 于 2005 年收购的 Android Inc. 开发。因此,在本文中,我们将学习如何在使用 Kotlin 的 Android 应用程序中使用@Inject 和 @Component 。我们会学习 Dagger 如何创建所需的对象吗?它如何使手动注射过程自动化?

先决条件:

  • 施工注入
  • 手动注射
  • 依赖注入基础
  • Kotlin 语法

在上一篇文章中,我们看到了手动注入是如何工作的,所以在这里我们将使用同一个项目来理解这个概念。 Dagger 2 Android 实现更简单,它基于依赖注入架构。 Dagger 为依赖类创建对象。 Dagger 需要知道如何为类创建实例。这里我们对构造函数使用@Inject注解,它将指示Dagger,如何使用@Inject注解的构造函数创建实例。因为在我们的应用程序中,UserRegistrationService 类依赖于 EmailService 类和 UserRepo 类。我们还需要将@Inject 注解添加到它们的构造函数中。

电子邮件服务类:

Kotlin
class EmailService @Inject constructor() {
    fun send(to: String,from: String,body:String){
       Log.d("result","Email sent")
    }
}


Kotlin
class UserRepo @Inject constructor() {
    fun saveUser(email:String,pass:String){
        Log.d("result","user data saved")
    }
}


Kotlin
class UserRegistrationService @Inject constructor(
    private val userRepo: UserRepo,
    private val emailService: EmailService
) {
    fun userRegistration(email:String,pass:String){
        userRepo.saveUser(email,pass)
        emailService.send(email,"abc@gmail.com","")
    }
}


Kotlin
@Component
interface UserRegistrationComponent {
    // as we need the object of 
    // UserRegistrationService class
    // in mainActivity
    fun getUserRegistrationService(): UserRegistrationService 
}


Kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        val userRegistrationService = DaggerUserRegistrationComponent.builder().build().getUserRegistrationService()
        userRegistrationService.userRegistration("xyz@gmail.com","11111")
    }
}


XML


  
    
  


UserRepo 类:

科特林

class UserRepo @Inject constructor() {
    fun saveUser(email:String,pass:String){
        Log.d("result","user data saved")
    }
}

用户注册服务类:

科特林

class UserRegistrationService @Inject constructor(
    private val userRepo: UserRepo,
    private val emailService: EmailService
) {
    fun userRegistration(email:String,pass:String){
        userRepo.saveUser(email,pass)
        emailService.send(email,"abc@gmail.com","")
    }
}

然后我们需要为Dagger 组件创建一个接口,一个组件只是我们项目中依赖项的集合,它可以在需要时找出应该从哪里获取这些依赖项。所以我们需要用@Component注解这个接口。在@Component 接口中,我们需要定义返回所需类实例的函数。

用户注册组件接口:

科特林

@Component
interface UserRegistrationComponent {
    // as we need the object of 
    // UserRegistrationService class
    // in mainActivity
    fun getUserRegistrationService(): UserRegistrationService 
}

getUserRegistrationService() 方法返回一个 UserRegistrationService 的对象,Dagger 创建它的对象(这是要返回的)。所以在 mainActivity 文件中,我们会调用这个方法。当我们构建这个项目时,Dagger 将创建一个字段作为 Dagger 附加组件接口的名称。就像在我们的例子中,我们需要构建它是 DaggerUserRegistrationComponent ( Dagger + UserRegistrationComponent),然后我们可以访问它的方法。

科特林

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
  
        val userRegistrationService = DaggerUserRegistrationComponent.builder().build().getUserRegistrationService()
        userRegistrationService.userRegistration("xyz@gmail.com","11111")
    }
}

XML 布局文件没有变化。

XML



  
    
  

因此,通过这种方式,我们可以将 Dagger 实现到我们的项目中。