临时构造函数注入与依赖注入框架

Pet*_*der 4 android dependency-injection

好的,因此,我决定仔细研究一下在我的项目中实施junit测试的情况。然后,我偶然发现了一篇文章,其中写到了使用依赖注入框架(例如Dagger2Koin)来简化测试的重要性

我试图读取-究竟什么是DI。我将其理解为解决A类依赖对象(例如B类和C类)的一种方式。

我现在通常要做的是:

在活动中,我创建ViewModelViewModel需要访问数据,所以对于数据我有SomeRepository课。然后,我通常SomeRepository通过ViewModel构造函数或使用属性注入。据我了解,如果我没有记错的话,那也是某种类型的依赖注入(如果我记错了,请更正我)。

那么,如果我现在开始使用Dagger 2,我将获得什么好处?也许简单的代码比较会使它更清晰?提前致谢。

活动:

val someRepository = SomeRepository()
viewModel.init(someRepository) 
Run Code Online (Sandbox Code Playgroud)

在ViewModel中:

class SomeViewModel : ViewModel {

    private lateinit var repository: SomeRepository

    fun init(val someRepo: SomeRepository) {
        this.repository = someRepo
    }

}
Run Code Online (Sandbox Code Playgroud)

Pro*_*kar 5

Dagger通过自己的依赖关系图促进依赖关系的解耦。我们需要告诉匕首类如何生成,例如,它需要一个构造函数参数。定义后,它将遍历所有依赖项并从低级别开始创建它们。如果我们不能在构造函数中注入任何依赖,例如Retrofit,我们可以手动告诉dagger如何创建带@Provides注释的if实例。

让我们来看一个例子:

依赖性#1-个体模

@Module
class NetworkModule {

 @Provides
 fun provideRetrofit() : Retrofit  

}
Run Code Online (Sandbox Code Playgroud)

依赖性#2-取决于依赖性#1

class ApiService constructor (@Inject retrofit: Retrofit){
}
Run Code Online (Sandbox Code Playgroud)

依赖#3-依赖于依赖#2

class SomeRepository constructor (@Inject apiService: ApiService){
}
Run Code Online (Sandbox Code Playgroud)

依赖#4-依赖于依赖#3

class SomeViewModel constructor (@Inject someRepository: SomeRepository) : ViewModel {
}
Run Code Online (Sandbox Code Playgroud)

Dagger将在运行时生成所有依赖项。当您运行应用程序时,每个依赖项已准备就绪,可以直接注入构造函数中。您还可以通过字段注入来注入所有这些依赖项

class MainAcitivty : AppCompatActivity(){

 @Inject someRepository: SomeRepository

}
Run Code Online (Sandbox Code Playgroud)

符合您目前的做法:

val someRepository = SomeRepository()
viewModel.init(someRepository) 
Run Code Online (Sandbox Code Playgroud)
  1. 您将SomeRepository()在不同的活动中反复创建一个新实例
  2. 如果SomeRepository()有任何依赖,那些也会被创建多次
  3. 您正在紧密耦合。如果SomeRepository()没有依赖项,将很难测试。在单元测试中,我们有兴趣测试单元而不是其依赖项。