[英]How to override macwire injectables in subclasses
Play網絡框架允許注入“過濾器”列表以對請求進行通用處理(gzip,cors,日志記錄等)
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
與惰性val一起使用。 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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.