我有一个服务类,服务有一个方法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实例的正确方式是什么?因为目前我需要在我的服务中使用这些实例,但是我没有它们,我应该如何正确地这样做呢?谢谢
发布于 2017-07-04 21:46:05
使用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开始,然后逐步添加更多,直到它起作用。
发布于 2017-09-04 23:00:32
对于配置,我建议使用类似于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) { ... }现在你就完事了。此一般规则适用于所有提供的依赖项。
https://stackoverflow.com/questions/44875361
复制相似问题