簡體   English   中英

如何在子類中覆蓋Macwire注射劑

[英]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]
    ...
}

我嘗試過的事情

  1. 上面的代碼。 不能將super與惰性val一起使用。
  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM