如何使用MacWire(播放框架)将依赖项注入服务

时间:2017-07-02 21:25:42

标签: scala playframework playframework-2.0 macwire

我有一个服务类,服务有一个方法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实例的正确方法是什么?因为目前我需要在我的服务中使用这些实例,但我没有它们,我该怎么做正确的方法呢? 感谢

2 个答案:

答案 0 :(得分: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,所以我对第一次尝试使用的信心相对较低,但是macwire播放示例建议mixing in certain Play modules提供WSClient所需的值。很可能并非所有这些都是必需的,但有些可能是 - 所以我建议从NingWSComponents开始并逐渐增加更多直到它起作用。

答案 1 :(得分: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]
}

MyApiServic e中添加WSClient作为参数。到构造函数

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

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