Что такое AhcWSComponents в среде Lagom?

Он показывает, что создание объекта невозможно, так как член wsClient:WSClient не определен, что используется для

class ShoppingCartLoader extends LagomApplicationLoader{
      override def load(context: LagomApplicationContext): LagomApplication = {

    //Commenting AhcWSComponents is giving error here
        new ShoppingCartApplication(context) {
          override def serviceLocator: ServiceLocator = NoServiceLocator
        }
      }

    }

 abstract class ShoppingCartApplication(context: LagomApplicationContext)
      extends LagomApplication(context)
        /*with AhcWSComponents*/{

      override lazy val lagomServer = serverFor[ShoppingCartService](wire[ShoppingCartImpl])

    }

Зайдя внутрь AhcWSComponents, он имеет:

lazy val wsClient: WSClient = {
    implicit val mat    = materializer
    implicit val ec     = executionContext
    val asyncHttpClient = new AsyncHttpClientProvider(environment, configuration, applicationLifecycle).get
    new AhcWSClientProvider(asyncHttpClient).get
  }

Если он нужен, то почему он не включен в саму LagomApplication


person supernatural    schedule 26.12.2019    source источник


Ответы (1)


LagomApplication требуется для wsClient, чтобы иметь единый интерфейс для выполнения HTTP-запросов к внешним службам. Реализация на основе AsyncHttpClient (подтянутая через AhcWSComponents) включена, но вполне допустимо использовать другую реализацию, если выполняются контракты. Таким образом, решение об использовании включенной реализации делается явным путем смешивания AhcWSComponents.

Одно из преимуществ этого требования возникает, когда приходит время писать тесты для функциональности, зависящей от выполнения запросов к внешним службам: вы можете иметь реализацию, которая имитирует внешние службы, и использовать эту реализацию во всех ваших тестах, вместо того, чтобы настраивать одни и те же издевательства во множестве люксов. Однако, чтобы воспользоваться этим, вы не хотите смешивать реализацию на уровне абстрактного класса:

class ShoppingCartLoader extends LagomApplicationLoader {
  override def load(context: LagomApplicationContext): LagomApplication = {
    // as above until
    new ShoppingCartApplication(context) with AhcWSComponents {
      override def serviceLocator: ServiceLocator = NoServiceLocator
    }
  }
}

// now you don't need `with AhcWSComponents` on the abstract class

Затем в ваших тестах, когда вам нужен LagomApplication:

new ShoppingCartApplication(context) {
  override def wsClient: WSClient = ??? // mock implementation here
}
person Levi Ramsey    schedule 26.12.2019