创建一个 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
找到示例 类 的工作示例
我有一个第 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
找到示例 类 的工作示例