首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何覆盖子类中的macwire注入器

如何覆盖子类中的macwire注入器
EN

Stack Overflow用户
提问于 2017-12-21 16:49:05
回答 1查看 167关注 0票数 0

Play web框架允许注入“筛选器”列表来对请求(gzip、cors、日志记录等)执行通用处理。

代码语言:javascript
复制
package play.api

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

我希望有一套共同的这些过滤器(和其他东西)。

代码语言:javascript
复制
package example

import play.api.BuildInComponents

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

可由子类使用的

代码语言:javascript
复制
package example.foo

import example.MyCommonComponents

trait MyFooComponents extends MyCommonComponents {
    ...
}

或添加到子类中

代码语言:javascript
复制
package example.bar

import example.MyCommonComponents

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

我试过的东西

  1. 上面的密码。不能在懒惰的val中使用super
  2. httpFilters改为def。由于BuiltInComponents需要一个稳定的值
  3. 添加lazy val httpFilters = filtersdef filters: Seq[EssentialFilter] = ...,然后酌情重写filters。Macwire抱怨类型不明确。

我能做些什么来实现可选附加的过滤器列表?

EN

回答 1

Stack Overflow用户

发布于 2017-12-21 18:26:26

我可能不明白你的情况,但简单的怎么了

代码语言:javascript
复制
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
}

或者这个

代码语言:javascript
复制
trait MyBarComponents extends MyCommonComponents {

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

  override def httpFilters = super.httpFilters ++ barFilters
}

为什么要重写您的lazy val而不是设计为要重写的基本httpFilters

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47929367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档