Dagger:如果我每次*想要*一个新实例怎么办?

Dagger: What if I *WANT* a new instance every time?

有趣的是这个答案很难找到。

我使用 Dagger - Android 有一段时间了,并且设置了我的整个依赖关系图。我正在使用范围、限定符,所有这些好东西。我不再是 Dagger 新手了,但足以说明我一直在我的 Android 设置中以非常标准的方式使用它,并且一切进展顺利。

我第一次意识到我想在我的图表中手动请求某个 class 的新实例,我 想要 每次都是一个新实例。

执行此操作的最佳方法是什么?我想知道是否有办法利用非@Singleton/non-scoped 提供程序并自己调用某种 create() 方法,或者最好自己创建一个工厂并使该工厂成为 singleton/scoped 实例并在我需要时使用我的工厂获取新实例? [我应该提到这个 class 肯定 不会 有一个空的构造函数,所以需要在我的注入图中定义的其他 classes 的注入实例。]

(此外,如果答案是在 Android 的上下文中,它可能会帮助最大;也就是说,我在一个 ViewModel 中,需要一些 class 定义的新实例在我的一个模块中。)

只要您不确定依赖项的范围,Dagger 就会为您提供一个新实例。

要手动获取依赖项的新实例,您可以注入它的 Provider 并使用它的 get() 方法,它会在您每次调用它时为您提供一个新实例。

模块部分没有真正改变:

@Module
class AppModule {

    @Provides
    fun provideSomeObject(): SomeObject = SomeObject()
}

在你的 class

class SomeClass {
    // We don't inject the object anymore
    // @Inject lateinit var myObject : SomeObject

    // We'll inject it's provider
    @Inject lateinit var myObject : Provider<SomeObject>

    fun someMethod(){
        // Here, instance1 and instance2 are NOT same objects
        val instance1 = myObject.get()
        val instance2 = myObject.get()
    }
}

您可以阅读更多内容here