如何覆盖子类中的macwire注入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何覆盖子类中的macwire注入相关的知识,希望对你有一定的参考价值。
Play web框架允许注入一个“过滤器”列表,对请求进行常见处理(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]
...
}
我尝试过的事情
- 上面的代码。不能使用lazy val的
super
。 - 将
httpFilters
改为def
。由于BuiltInComponents,需要是一个稳定的值 - 添加
lazy val httpFilters = filters
和def filters: Seq[EssentialFilter] = ...
然后适当地覆盖filters
。 Macwire抱怨模棱两可的类型。
我该怎么做才能实现可选的附加过滤器列表?
答案
我可能没有得到你的场景,但简单的错误
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
,它们似乎被设计为被覆盖。
以上是关于如何覆盖子类中的macwire注入的主要内容,如果未能解决你的问题,请参考以下文章
如何使用模块化代码片段中的LeakCanary检测内存泄漏?
当 ViewPager 中的片段出现和消失时如何执行一些代码