Как внедрить зависимости в сервис с 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]
}
Теперь у меня вопрос: как правильно использовать конфигурацию Wiring Play и экземпляры WSClient? потому что в настоящее время мне нужны эти экземпляры в моем сервисе, но у меня их нет, как мне сделать это правильно? Спасибо
2 ответа
С 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 для получения значений, необходимых для 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 нужно использовать AhcWSComponents
которые предоставляются ws
зависимость следующим образом:
В вашем файле build.sbt добавьте зависимость ws в ваш проект
libraryDependencies += ws
В вашем модуле есть черта AhcWSComponents
черт и провод WSClient
trait ServicesModule with AhcWSComponents {
lazy val wsClient = wire[WSClient]
lazy val apiService = wire[MyApiService]
}
В вашем MyApiServic
добавить WSClient
как парам. конструктору
class MyApiService(wsClient: WSClient) { ... }
И теперь вы сделали. Это общее правило применяется ко всем указанным зависимостям.