创建一个 AbstractModule 以注入对第 3 方库的依赖

Creating a AbstractModule to inject a dependency for a 3rd party library

我有一个第 3 方库,我正在尝试将配置注入构造函数。 这是我需要做的:

class MyModule(configuration: Configuration) extends AbstractModule {
  override def configure(): Unit = {
     bind(classOf[TwitterApi])
       .to(classOf[MyTwitterApi])
       .asEagerSingleton
  }
}

MyTwitterApi 的构造函数不采用 Play.api.Configuration,而是采用 typesafe.config.Config

class MyTwitterApi(config: Config) ...

所以我需要将 configuration.underlying 传递给我的构造函数,这怎么可能在这个 AbstractModule 中使用 DI?

我需要这个实例也是一个单例。

我想你想要这样的东西:

class MyModule(configuration: Configuration) extends AbstractModule {
  override def configure(): Unit = {
     val myTwitterApiInstance = new MyTwitterApi(configuration.underlying)
     bind(classOf[TwitterApi])
       .toInstance(myTwitterApiInstance)
  }
}

或者另一种方法是为 Config 提供绑定,但如果您的 MyTwitterApi 没有 @Inject 注释,这将无济于事。

您可以使用 provider 通过 eagerSingleton 设置您的模块

import com.google.inject.{AbstractModule, Provider}

class MyModule(configuration: Configuration) extends AbstractModule {
  override def configure(): Unit = {
     val twitterApiProvider: Provider[TwitterApi] = 
       () => new MyTwitterApi(configuration.underlying)
     bind(classOf[TwitterApi])
       .toProvider(twitterApiProvider)
       .asEagerSingleton
  }
}

您可以在 - https://scastie.scala-lang.org/sarveshseri/ujwvJJNnTpiWDqdkBJQoFw/2

找到示例 类 的工作示例