我有一个服务类,服务有一个方法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实例的正确方法是什么?因为目前我需要在我的服务中使用这些实例,但我没有它们,我该怎么做正确的方法呢? 感谢
答案 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) { ... }
现在你已经完成了。此一般规则适用于所有提供的依赖项。