我有一个要注入的类,该类具有接收一个参数(上下文)的构造函数。
我通常将其绑定到实例,但是此类具有JNI依赖关系,因此无法使用Robolectric实例化它,这阻止了我在配置模块时测试应用程序的一部分。
我已将其设置为绑定到类,并已将目标类注释为单例,并将构造函数注释为inject,但它并未为此构造工厂。
我很乐意提供自己的工厂,但是我在文档中找不到任何有关此的信息。
这是我进行装订的部分:
val module = Module()
module.bind(Interface::class.java).to(InterfaceImpl::class.java)
scope.installModules(module)
这是我设置课程的方式:
@Singleton
class InterfaceImpl : Interface {
@Inject
constructor(applicationContext: Context) {
[...]
}
}
请清楚一点,如果我在绑定时使用toInstance,它将起作用。
val module = Module()
module.bind(Interface::class.java).toInstance(InterfaceImpl(context))
scope.installModules(module)
如何使注入的构造函数将其绑定到类上?
答案 0 :(得分:0)
我找到了办法。该文档有点缺乏。
我可以使用提供者实例将其绑定:
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()
答案 1 :(得分:0)
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
}}