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。
有趣的是这个答案很难找到。
我使用 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。