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 实现到我们的项目中。