2

我有一个服务类,并且该服务有一个方法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 实例的正确方法是什么..?因为目前我在我的服务中需要这些实例,但我没有它们,我应该如何以正确的方式做到这一点?谢谢

4

2 回答 2

0

对于配置,我建议使用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 开始,应该使用依赖项AhcWSComponents提供的ws内容,如下所示:

在您的 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) { ... }

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

于 2017-09-04T15:00:31.777 回答
0

使用 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 示例建议混合某些 Play 模块以提供 WSClient 所需的值。很可能并非所有这些都是必需的,但有些可能是 - 所以我建议从只是开始NingWSComponents并逐渐添加更多直到它起作用。

于 2017-07-04T13:46:05.247 回答