当构造函数在牙签中有参数时通过工厂注入
Injecting via a factory when constructor has parameters in toothpick
我有一个要注入的 class,它有一个接收一个参数 (Context) 的构造函数。
我通常会将它绑定到一个实例,但是这个 class 具有 JNI 依赖项,我无法使用 Robolectric 实例化它,这阻止了我在模块已配置。
我已经将它设置为绑定到 class 并且我已经将目标 class 注释为单例,并将构造函数注释为注入,但它没有为它构造一个工厂。
我很乐意提供我自己的工厂,但我在文档中找不到任何相关信息。
这是我绑定的部分:
val module = Module()
module.bind(Interface::class.java).to(InterfaceImpl::class.java)
scope.installModules(module)
这就是我设置 class:
的方式
@Singleton
class InterfaceImpl : Interface {
@Inject
constructor(applicationContext: Context) {
[...]
}
}
明确一点,如果我在进行绑定时使用 toInstance,它确实有效。
val module = Module()
module.bind(Interface::class.java).toInstance(InterfaceImpl(context))
scope.installModules(module)
如何让注入的构造函数工作以将其绑定到 class?
我找到了一个方法。文档有点欠缺
我可以使用提供程序实例绑定它:
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()
SomeModule(getContext())
bind(Context::class.java).toInstance(context)
bind(InterfaceImpl::class.java).singletonInScope()
bind(Interface::class.java).toProvider(InterfaceProvider::class.java).providesSingletonInScope()
class InterfaceProvider @Inject constructor(private val impl: InterfaceImpl) : Provider<Interface> {
override fun get(): Interface{
return impl
}}
我有一个要注入的 class,它有一个接收一个参数 (Context) 的构造函数。
我通常会将它绑定到一个实例,但是这个 class 具有 JNI 依赖项,我无法使用 Robolectric 实例化它,这阻止了我在模块已配置。
我已经将它设置为绑定到 class 并且我已经将目标 class 注释为单例,并将构造函数注释为注入,但它没有为它构造一个工厂。
我很乐意提供我自己的工厂,但我在文档中找不到任何相关信息。
这是我绑定的部分:
val module = Module()
module.bind(Interface::class.java).to(InterfaceImpl::class.java)
scope.installModules(module)
这就是我设置 class:
的方式@Singleton
class InterfaceImpl : Interface {
@Inject
constructor(applicationContext: Context) {
[...]
}
}
明确一点,如果我在进行绑定时使用 toInstance,它确实有效。
val module = Module()
module.bind(Interface::class.java).toInstance(InterfaceImpl(context))
scope.installModules(module)
如何让注入的构造函数工作以将其绑定到 class?
我找到了一个方法。文档有点欠缺
我可以使用提供程序实例绑定它:
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()
SomeModule(getContext())
bind(Context::class.java).toInstance(context)
bind(InterfaceImpl::class.java).singletonInScope()
bind(Interface::class.java).toProvider(InterfaceProvider::class.java).providesSingletonInScope()
class InterfaceProvider @Inject constructor(private val impl: InterfaceImpl) : Provider<Interface> {
override fun get(): Interface{
return impl
}}