簡體   English   中英

如何使用MacWire(播放框架)向服務注入依賴項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM