@Inject Lateinit var 与 Dagger Hilt 上的 @Inject 构造函数

问题描述 投票:0回答:1

阅读文档,我发现可以通过这两种方式使用Hilt:

  1. @Inject lateinit var
    仅在您想要注入的类字段上
  2. @Inject constructor

我正在尝试找出哪个选项更好。我个人在

@Inject constructor
上发现了一个问题。当我需要将非 Hilt 参数传递给构造函数时,它需要您生成大量样板代码,这只会迫使您增加项目的复杂性。例如:

有这样的课程:

@AndroidEntryPoint 
class CustomClass @Inject constructor (val repository: Repository, val name: String) {

假设我只想注入存储库参数,但我想在初始化期间传递名称参数,如下所示:

val customClass = CustomClass("name")

@Inject constructor
我被迫添加大量样板和复杂性:

@AndroidEntryPoint 
class CustomClass @AssisgtedInject constructor (
    val repository: Repository, 
    @Assisted val name: String
) {

    @AssistedFactory
    interface CustomClassFactory {
        fun create(name: String): CustomClass
    }
}

要添加更多样板文件和无用的复杂性,这会迫使您使用

CustomClass
而不是普通的
interface
创建
class
类,并调用
create
方法。

另一方面,如果您使用

@Inject lateinit var
来完成,是不是很简单:

@AndroidEntryPoint 
class CustomClass(val name: String) {
    @Inject lateinit var repository: Repository
}

现在,认为这是一个超级简单的示例,只有一个非 Hilt 参数,但正如您所知,这可能会变得更大。

那么,如果

@Inject constructor
是更好的选择,为什么几乎每个示例项目都使用
@Inject lateinit var
呢?我在这里失去了什么?

android kotlin dependency-injection dagger-hilt
1个回答
0
投票

并不是一个比另一个更好。每个都有其优点和缺点。我可以看到使用基于构造函数的方法的一些好处:

  1. 依赖项是不可变的,因为您不使用
    var
  2. 在测试期间更容易模拟依赖关系
  3. 具有明确的依赖关系,因为它们存在于构造函数中,而不是类中的某个位置。
© www.soinside.com 2019 - 2024. All rights reserved.