1

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

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

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

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

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

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)

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

4

2 回答 2

1

我找到了一个方法。文档有点缺乏。

我可以使用提供者实例绑定它:

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()
于 2018-09-17T13:34:35.087 回答
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
        }}
于 2018-11-24T10:01:58.793 回答