【问题标题】:Creating a AbstractModule to inject a dependency for a 3rd party library创建一个 AbstractModule 来为 3rd 方库注入依赖项
【发布时间】:2021-07-16 14:13:38
【问题描述】:

我有一个第 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?

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

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

    您可以使用 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 找到一个带有示例类的工作示例

    【讨论】:

    • 我不确定提供者是什么,在我的其他将 TwitterApi 用于构造函数的类中,我是使用 TwitterApi 还是?
    • Provider 是为类型提供实例的东西。也称为工厂。你可以在你的其他类中注入TwitterApi
    • 我认为这与我的建议完全相同,尽管我承认它更明确地设置为单例。
    • @Blankman 提供者是com.google.inject.Provider
    【解决方案2】:

    我想你想要这样的东西:

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

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

    【讨论】:

    • 我需要这个是单身,这会是一个吗?
    • 我认为是这样,因为它将始终提供在 configure 方法中创建的相同实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多