【问题标题】:how to inject dependencies to a service with MacWire (play framework)如何使用 MacWire(播放框架)将依赖项注入服务
【发布时间】:2017-12-06 02:52:29
【问题描述】:

我有一个服务类,并且该服务有一个方法 getSomethingFromApi ,现在,我想要播放配置实例,以便我可以从 application.conf 中提取内容,以及播放 WSClient 以便我可以执行 http 调用。

这就是我希望我的服务的外观:

class MyApiService {

  def getSomethingFromApi(whichApi: String): Future[ApiRes] = {
    wsClient.url(configuration.getString(whichApi)).withHttpHeaders(("Content-Type", "application/json")).get.map { res =>
      response.status match {
        case Status.OK => // do something
        case _ => throw new Exception
      }
    }
  }

}

这是连接我的服务的 ServicesModule:

import com.softwaremill.macwire._

trait ServicesModule {

  lazy val myService: MyApiService = wire[MyApiService]

}

我现在的问题是使用接线播放配置和 WSClient 实例的正确方法是什么..?因为目前我在我的服务中需要这些实例,但我没有它们,我应该如何以正确的方式做到这一点? 谢谢

【问题讨论】:

  • class MyApiService @Inject() (ws: WSClient)
  • @erip 但是服务模块如何传递这个注入的依赖关系?它是macwire @Inject()吗?因为如果不是,它将在运行时进行评估,不是吗?我想让它保持纯 macwire 手册 di

标签: scala playframework playframework-2.0 macwire


【解决方案1】:

使用 macwire 它可能看起来像这样

// MyApiService.scala
class MyApiService(wsClient: WSClient) { ... }

// ServicesModule.scala
trait ServicesModule with NingWSComponents {
    lazy val wsClient = wire[WSClient]
    lazy val apiService = wire[MyApiService]
}

我自己没有尝试使用 macwire 和 play,所以我对它在第一次尝试时会起作用的信心相对较低,但 macwire play 示例建议 mixing in certain Play modules 提供 WSClient 所需的值。很可能并非所有这些都需要,但有些可能需要 - 所以我建议从 NingWSComponents 开始,然后逐渐添加更多直到它起作用。

【讨论】:

  • 感谢您的回答 :) 如果我这样做,如何从 MyApiService 访问 wsClient 和 apiService ..?我想扩展 ServicesModule?
  • @jackmiao apiServiceMyApiService 的一个实例,所以你不能在那里访问它。从MyApiService 访问wsClient 很简单——它是构造函数参数之一,因此您只需在此处执行wsClient.url(...)
【解决方案2】:

对于配置,我建议使用PureConfig 之类的内容并按如下方式加载配置

import pureconfig._
import pureconfig.error.ConfigReaderFailures

case class YourConfClass(name: String, quantity: Int)

val config: Either[pureconfig.error.ConfigReaderFailures,YourConfClass] = loadConfig[YourConfClass]

然后可以使用 macwire 将其传递给应用程序的任何组件。

从 Play 2.6.X 开始,应使用由 ws 依赖项提供的 AhcWSComponents,如下所示:

在您的 build.sbt 文件中,将 ws 依赖项添加到您的项目中

libraryDependencies += ws

在您的模块特征中混合AhcWSComponents 特征并连接WSClient

trait ServicesModule with AhcWSComponents {
    lazy val wsClient = wire[WSClient]
    lazy val apiService = wire[MyApiService]
}

在您的MyApiService 中添加WSClient 作为参数。给构造函数

class MyApiService(wsClient: WSClient) { ... }

现在你已经完成了。此一般规则适用于所有提供的依赖项。

【讨论】:

    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 2015-10-11
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多