简体   繁体   English

如何在子类中覆盖Macwire注射剂

[英]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 我尝试过的事情

  1. The code above. 上面的代码。 Can't use super with a lazy val. 不能将super与惰性val一起使用。
  2. Changing httpFilters to def . httpFilters更改为def Needs to be a stable value due to BuiltInComponents 由于BuiltInComponents,需要为稳定值
  3. Adding lazy val httpFilters = filters and def filters: Seq[EssentialFilter] = ... and then overriding filters as appropriate. 添加lazy val httpFilters = filtersdef 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM