如何覆盖子类中的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]
    ...
}

我尝试过的事情

  1. 上面的代码。不能使用lazy val的super
  2. httpFilters改为def。由于BuiltInComponents,需要是一个稳定的值
  3. 添加lazy val httpFilters = filtersdef 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 中的片段出现和消失时如何执行一些代码

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?

如何覆盖搜索视图中的向上按钮行为

如何解决 Nestjs 中的“策略#authenticate 必须被子类覆盖”错误