Как переопределить инъекции Macwire в подклассах

Веб-инфраструктура Play позволяет вводить список "фильтров" для общей обработки запросов (gzip, cors, logging и т. Д.)

package play.api

trait BuiltInComponents {
  ...
  lazy val httpFilters: Seq[EssentialFilter] = Nil
  <stuff that uses httpFilters>
  ...
}

Я хотел бы иметь общий набор этих фильтров (и других вещей).

package example

import play.api.BuildInComponents

trait MyCommonComponents extends BuiltInComponents {
    ...
    override lazy val filters = Seq(
      wire[Filter1],
      wire[Filter2],
      wire[Filter3]
    )
    ...
}

Какие могут быть использованы подклассами

package example.foo

import example.MyCommonComponents

trait MyFooComponents extends MyCommonComponents {
    ...
}

Или добавлены к подклассам

package example.bar

import example.MyCommonComponents

trait MyBarComponents extends MyCommonComponents {
    ...
    override lazy val filters = super.filters :+ wire[Filter4]
    ...
}

Вещи, которые я пробовал

  1. Код выше. Не могу использовать super с ленивым валом
  2. изменения httpFilters в def, Должен быть стабильным значением из-за BuiltInComponents
  3. Добавление lazy val httpFilters = filters а также def filters: Seq[EssentialFilter] = ... а затем переопределить filters по мере необходимости. Macwire жалуется на неоднозначные типы.

Что я могу сделать, чтобы получить опционально добавленный список фильтров?

1 ответ

Я, вероятно, не понимаю ваш сценарий, но что не так с простым

import com.softwaremill.macwire._
import play.api.BuiltInComponents
import play.api.mvc.{EssentialAction, EssentialFilter}

class Filter1 extends EssentialFilter {
  override def apply(next: EssentialAction) = next
}

class Filter2 extends EssentialFilter {
  override def apply(next: EssentialAction) = next
}

class Filter3 extends EssentialFilter {
  override def apply(next: EssentialAction) = next
}

trait MyCommonComponents extends BuiltInComponents {

  protected lazy val baseFilters: Seq[EssentialFilter] = Seq(
    wire[Filter1],
    wire[Filter2],
  )

  override def httpFilters = baseFilters
}


trait MyFooComponents extends MyCommonComponents {

  protected lazy val fooFilters = baseFilters :+ wire[Filter3]

  override def httpFilters = fooFilters
}

или это

trait MyBarComponents extends MyCommonComponents {

  private lazy val barFilters = Seq[EssentialFilter](wire[Filter3])

  override def httpFilters = super.httpFilters ++ barFilters
}

Почему вы хотите переопределить ваш lazy val вместо базы httpFilters которые, кажется, предназначены именно для того, чтобы быть переопределенными.

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