目录
引
依赖注入(DI)是一种设计模式,用于减少代码间的耦合度。在不使用依赖注入的情况下,对象通常会自己创建它们所需的依赖对象,这导致代码之间的高耦合和难以测试。使用依赖注入后,这些依赖会被注入到对象中,而不是由对象自己创建,从而提高了代码的模块化和可测试性。
实现依赖项注入可带来以下优势:
- 重用代码
- 易于重构
- 易于测试
正文
没有使用依赖注入的例子
class UserRepository {
fun getUserData(): String {
// 从数据库获取用户数据
return "用户数据"
}
}
class UserProfileViewModel {
private val userRepository = UserRepository()
fun getUserProfile(): String {
return userRepository.getUserData()
}
}
UserProfileViewModel
类直接创建了一个 UserRepository
的实例。这种方式导致了UserProfileViewModel
和 UserRepository
之间的高耦合。
如果想要为 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 注入的字段不能是私有字段。