依赖注入解释以及使用Hilt依赖注入提升Android应用的可测试性

本文介绍了依赖注入(DI)的设计模式,特别是在Android开发中如何通过Hlint实现,包括优点如降低耦合度和提高测试性。通过例子展示了如何在类中使用@Inject和@AndroidEntryPoint进行字段注入,以增强代码的灵活性和可扩展性。
摘要由CSDN通过智能技术生成

目录

正文

没有使用依赖注入的例子

使用Hlint依赖注入

Hlint

字段注入


依赖注入(DI)是一种设计模式,用于减少代码间的耦合度。在不使用依赖注入的情况下,对象通常会自己创建它们所需的依赖对象,这导致代码之间的高耦合和难以测试。使用依赖注入后,这些依赖会被注入到对象中,而不是由对象自己创建,从而提高了代码的模块化和可测试性。

实现依赖项注入可带来以下优势:

  • 重用代码
  • 易于重构
  • 易于测试

正文

没有使用依赖注入的例子

class UserRepository {
    fun getUserData(): String {
        // 从数据库获取用户数据
        return "用户数据"
    }
}

class UserProfileViewModel {
    private val userRepository = UserRepository()

    fun getUserProfile(): String {
        return userRepository.getUserData()
    }
}

UserProfileViewModel 类直接创建了一个 UserRepository 的实例。这种方式导致了UserProfileViewModelUserRepository 之间的高耦合。

如果想要为 UserProfileViewModel 编写单元测试,同时不依赖于 UserRepository 的具体实现(例如使用一个模拟的 UserRepository),这种方式就会变得比较困难。

使用Hlint依赖注入

首先需要在项目中添加 Hilt 的依赖

与 LogApplication 类中 ServiceLocator 的实例的使用和初始化方式类似,要添加附着于应用的生命周期的容器,我们需要为 Application 类添加 @HiltAndroidApp 注解。

@HiltAndroidApp
class LogApplication : Application() {
    ...
}

 定义 UserRepository 作为一个依赖项,并使用 Hilt 提供的注解来标记它

import javax.inject.Inject

class UserRepository @Inject constructor() {
    fun getUserData(): String {

        return "用户数据"
    }
}

通过这种方式,UserProfileViewModel 不再直接依赖于 UserRepository 的具体实现,而是通过构造函数从外部接收一个 UserRepository 的实例。这使得 UserProfileViewModel 更容易被测试,因为可以很容易地传入一个模拟的 UserRepository 实例。

依赖注入的概念:依赖项不是由对象自己创建,而是从外部注入,从而减少了代码间的耦合度,提高了代码的可测试性和可维护性。

Hlint

Hilt 是 Android 颇具特色的依赖项注入库,可减少在项目中使用手动依赖项注入时产生的样板代码。手动依赖注入要求手动构造每个类及其依赖项,并借助容器来重复使用和管理依赖项。

Hilt 通过为项目中的每个 Android 组件提供容器并自动管理容器生命周期,提供了一种在应用中执行依赖项注入的标准方法。这通过利用热门依赖项注入库Dragger实现。

字段注入

@AndroidEntryPoint
class LogsFragment : Fragment() {

    @Inject lateinit var logger: LoggerLocalDataSource
    @Inject lateinit var dateFormatter: DateFormatter

    ...
}

对于要进行注入的字段,可以利用 @Inject 注解让 Hilt 注入不同类型的实例Hilt 注入的字段不能是私有字段。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏目艾拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值