当构造函数在牙签中有参数时通过工厂注入

时间:2018-09-17 12:36:30

标签: java android toothpick-di

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

我通常将其绑定到实例,但是此类具有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)

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

2 个答案:

答案 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
        }}