Как внедрить зависимости в сервис с 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) { ... }

И теперь вы сделали. Это общее правило применяется ко всем указанным зависимостям.

Другие вопросы по тегам