[英]how to inject dependencies to a service with MacWire (play framework)
我有一個服務類,該服務有一個方法getSomethingFromApi
,現在,我想擁有一個播放Configuration實例,以便可以從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實例的正確方法是什么? 因為當前我需要在我的服務中使用那些實例,但是我沒有它們,我該怎么做才正確? 謝謝
使用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
開始,然后逐漸添加更多,直到它起作用為止。
對於配置,我建議使用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]
}
在您的MyApiServic
E添加的WSClient
作為PARAM。 給構造函數
class MyApiService(wsClient: WSClient) { ... }
現在您完成了。 該通用規則適用於所有提供的依賴項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.