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

时间:2018-12-13 14:19:46

标签: android dependency-injection dagger

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

我已经使用Dagger-Android已有一段时间了,并设置了我的整个依赖图。我正在使用范围,限定符以及所有这些好东西。我不再是Dagger的新手,但是可以说我在Android设置中一直以非常标准的方式使用它,并且一切都进行得很好。

我第一次意识到,我想手动请求自己的图形中某个类的新实例,而我希望每次都将其作为新实例。

执行此操作的最佳方法是什么?我想知道是否有办法利用非@ Singleton /非作用域的提供程序并自己调用某种create()方法,还是最好自己创建一个工厂并使该工厂成为单例/作用域实例并在需要时使用我的工厂来获取新实例? [我应该提一下,此类肯定没有拥有一个空的构造函数,因此需要在注入图中定义的其他类的注入实例。”

(此外,如果答案是在Android上下文中,这可能会最大程度地帮助您;例如,我在一个ViewModel中,并且需要在我的一个模块中定义的某个类的新实例。)

1 个答案:

答案 0 :(得分:1)

只要您不限制依赖项,Dagger就会为您提供一个新实例。

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

模块部分并没有真正改变:

@Module
class AppModule {

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

在你的班上

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