Pet*_*der 4 android dependency-injection
好的,因此,我决定仔细研究一下在我的项目中实施junit测试的情况。然后,我偶然发现了一篇文章,其中写到了使用依赖注入框架(例如Dagger2和Koin)来简化测试的重要性。
我试图读取-究竟什么是DI。我将其理解为解决A类依赖对象(例如B类和C类)的一种方式。
我现在通常要做的是:
在活动中,我创建ViewModel。ViewModel需要访问数据,所以对于数据我有SomeRepository课。然后,我通常SomeRepository通过ViewModel构造函数或使用属性注入。据我了解,如果我没有记错的话,那也是某种类型的依赖注入(如果我记错了,请更正我)。
那么,如果我现在开始使用Dagger 2,我将获得什么好处?也许简单的代码比较会使它更清晰?提前致谢。
活动:
val someRepository = SomeRepository()
viewModel.init(someRepository) 
在ViewModel中:
class SomeViewModel : ViewModel {
    private lateinit var repository: SomeRepository
    fun init(val someRepo: SomeRepository) {
        this.repository = someRepo
    }
}
Dagger通过自己的依赖关系图促进依赖关系的解耦。我们需要告诉匕首类如何生成,例如,它需要一个构造函数参数。定义后,它将遍历所有依赖项并从低级别开始创建它们。如果我们不能在构造函数中注入任何依赖,例如Retrofit,我们可以手动告诉dagger如何创建带@Provides注释的if实例。
让我们来看一个例子:
依赖性#1-个体模
@Module
class NetworkModule {
 @Provides
 fun provideRetrofit() : Retrofit  
}
依赖性#2-取决于依赖性#1
class ApiService constructor (@Inject retrofit: Retrofit){
}
依赖#3-依赖于依赖#2
class SomeRepository constructor (@Inject apiService: ApiService){
}
依赖#4-依赖于依赖#3
class SomeViewModel constructor (@Inject someRepository: SomeRepository) : ViewModel {
}
Dagger将在运行时生成所有依赖项。当您运行应用程序时,每个依赖项已准备就绪,可以直接注入构造函数中。您还可以通过字段注入来注入所有这些依赖项
class MainAcitivty : AppCompatActivity(){
 @Inject someRepository: SomeRepository
}
符合您目前的做法:
val someRepository = SomeRepository()
viewModel.init(someRepository) 
SomeRepository()在不同的活动中反复创建一个新实例SomeRepository()有任何依赖,那些也会被创建多次SomeRepository()没有依赖项,将很难测试。在单元测试中,我们有兴趣测试单元而不是其依赖项。  | 归档时间: | 
 | 
| 查看次数: | 105 次 | 
| 最近记录: |