gpt4 book ai didi

java - 当构造函数在牙签中有参数时通过工厂注入(inject)

转载 作者:行者123 更新时间:2023-11-30 06:00:22 26 4
gpt4 key购买 nike

我有一个想要注入(inject)的类,它有一个接收一个参数(上下文)的构造函数。

我通常会将其绑定(bind)到一个实例,但此类具有 JNI 依赖项,并且我无法使用 Robolectric 实例化它,这会阻止我在配置模块时测试应用程序的部分。

我已将其设置为与类的绑定(bind),并将目标类注释为单例,并将构造函数注释为注入(inject),但它没有为其构造工厂。

我很乐意提供我自己的工厂,但我在文档中找不到任何相关信息。

这是我进行绑定(bind)时的部分:

val module = Module()        
module.bind(Interface::class.java).to(InterfaceImpl::class.java)
scope.installModules(module)

这就是我设置类(class)的方式:

@Singleton
class InterfaceImpl : Interface {

@Inject
constructor(applicationContext: Context) {
[...]
}
}

需要明确的是,如果我在进行绑定(bind)时使用 toInstance,它确实可以工作。

val module = Module()        
module.bind(Interface::class.java).toInstance(InterfaceImpl(context))
scope.installModules(module)

如何让注入(inject)的构造函数将其绑定(bind)到类?

最佳答案

我找到了办法。文档有点缺乏。

我可以使用提供程序实例绑定(bind)它:

val module = Module()
module.bind(Interface::class.java).toProviderInstance(InterfaceProvider(this))
scope.installModules(module)

然后有这样的InterfaceProvider:

class InterfaceProvider (private val context: Context): Provider<Interface> {

companion object {
private var instance: Interface? = null
}

override fun get(): Interface {
if (instance == null) {
instance = InterfaceImpl(context)
}
return instance!!
}
}

或者以更简单的方式,在 Kotlin 中使用 lambda:

val module = Module()
module.bind(Interface::class.java).toProviderInstance {
InterfaceImpl(this)
}.providesSingletonInScope()

关于java - 当构造函数在牙签中有参数时通过工厂注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52367914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com