Как переопределить инъекции 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]
...
}
Вещи, которые я пробовал
- Код выше. Не могу использовать
super
с ленивым валом - изменения
httpFilters
вdef
, Должен быть стабильным значением из-за BuiltInComponents - Добавление
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
которые, кажется, предназначены именно для того, чтобы быть переопределенными.