[英]How to override macwire injectables in subclasses
The Play web framework allows injecting a list of "filters" to do common processing on requests (gzip, cors, logging, etc.) Play网络框架允许注入“过滤器”列表以对请求进行通用处理(gzip,cors,日志记录等)
package play.api
trait BuiltInComponents {
...
lazy val httpFilters: Seq[EssentialFilter] = Nil
<stuff that uses httpFilters>
...
}
I would like to have a common set of these filters (and other things). 我想拥有一组通用的这些过滤器(和其他东西)。
package example
import play.api.BuildInComponents
trait MyCommonComponents extends BuiltInComponents {
...
override lazy val filters = Seq(
wire[Filter1],
wire[Filter2],
wire[Filter3]
)
...
}
Which can be used by subclasses 可以由子类使用
package example.foo
import example.MyCommonComponents
trait MyFooComponents extends MyCommonComponents {
...
}
Or added to by subclasses 或由子类添加
package example.bar
import example.MyCommonComponents
trait MyBarComponents extends MyCommonComponents {
...
override lazy val filters = super.filters :+ wire[Filter4]
...
}
Things I have tried 我尝试过的事情
super
with a lazy val. 不能将super
与惰性val一起使用。 httpFilters
to def
. 将httpFilters
更改为def
。 Needs to be a stable value due to BuiltInComponents 由于BuiltInComponents,需要为稳定值 lazy val httpFilters = filters
and def filters: Seq[EssentialFilter] = ...
and then overriding filters
as appropriate. 添加lazy val httpFilters = filters
和def filters: Seq[EssentialFilter] = ...
,然后根据需要覆盖filters
。 Macwire complains about ambiguous types. Macwire抱怨类型不明确。 What can I do to achieve the optionally appended list of filters? 我该怎么做才能获得可选的过滤器列表?
I probably don't get your scenario but what's wrong with simple 我可能不了解您的情况,但简单的操作有什么问题
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
}
or this 或这个
trait MyBarComponents extends MyCommonComponents {
private lazy val barFilters = Seq[EssentialFilter](wire[Filter3])
override def httpFilters = super.httpFilters ++ barFilters
}
Why do you want to override your lazy val
instead of the base httpFilters
that seem to be designed exactly to be overridden. 为什么要覆盖您的lazy val
而不是似乎被设计为完全被覆盖的基本httpFilters
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.