Я пытаюсь перейти от Play 2.4 до 2.5, избегая устаревших вещей.
У меня был abstract class Microservice
, из которого я создал некоторые объекты. Некоторые функции класса Microservice
использовали play.api.libs.ws.WS
, чтобы сделать HTTP-запросы, а также play.Play.application.configuration
для чтения конфигурации.
Раньше все, что мне нужно, это импорт:
import play.api.libs.ws._
import play.api.Play.current
import play.api.libs.concurrent.Execution.Implicits.defaultContext
Но теперь вы должны использовать инъекцию зависимостей для использования WS
, а также для использования доступа к текущему приложению воспроизведения.
У меня есть что-то вроде этого (сокращенно):
abstract class Microservice(serviceName: String) {
// ...
protected lazy val serviceURL: String = play.Play.application.configuration.getString(s"microservice.$serviceName.url")
// ...and functions using WS.url()...
}
Объект выглядит примерно так (сокращенно):
object HelloWorldService extends Microservice("helloWorld") {
// ...
}
К сожалению, я не понимаю, как получить весь материал (WS, configuration, ExecutionContect) в абстрактный класс, чтобы он работал.
Я попытался изменить его на:
abstract class Microservice @Inject() (serviceName: String, ws: WSClient, configuration: play.api.Configuration)(implicit context: scala.concurrent.ExecutionContext) {
// ...
}
Но это не решает проблему, потому что теперь мне тоже нужно изменить объект, и я не могу понять, как это сделать.
Я попытался превратить object
в @Singleton class
, например:
@Singleton
class HelloWorldService @Inject() (implicit ec: scala.concurrent.ExecutionContext) extends Microservice ("helloWorld", ws: WSClient, configuration: play.api.Configuration) { /* ... */ }
Я пробовал всевозможные комбинации, но я никуда не дену, и я чувствую, что на самом деле я на самом деле не прав.
Любые идеи о том, как я могу использовать такие вещи, как WS, надлежащим образом (не используя устаревшие методы), не делая вещи такими сложными?