2017-12-21 20 views
0

プレイWebフレームワークは、私が持っていると思いサブクラスでmacwire注射剤を上書きする方法

package play.api 

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

要求(GZIP、CORS、ログなど)に共通の処理を行うには、「フィルタ」のリストを注入することができますこれらのフィルタの共通セット(および他のもの)。サブクラスによってサブクラス

package example.foo 

import example.MyCommonComponents 

trait MyFooComponents extends MyCommonComponents { 
    ... 
} 

で使用されるか、または追加することができ

package example 

import play.api.BuildInComponents 

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

私が試してみました

package example.bar 

import example.MyCommonComponents 

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

物事

  1. 上記のコード。遅延のあるsuperは使用できません。
  2. httpFiltersdefに変更してください。 BuiltInComponentsのために安定した値にする必要があります。lazy val httpFilters = filtersdef filters: Seq[EssentialFilter] = ...を追加し、filtersを適切に上書きして、lazy val httpFilters = filtersとを追加します。
  3. Macwireはあいまいなタイプについて不平を言う。

オプションで追加されたフィルタのリストを得るにはどうすればよいですか?

答えて

0

私はおそらくあなたのシナリオを取得しますが、単純な

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 
} 

かのように見えるあなたのlazy val代わりのベースhttpFiltersを上書きしたいんなぜこの

trait MyBarComponents extends MyCommonComponents { 

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

    override def httpFilters = super.httpFilters ++ barFilters 
} 

と間違って何していませんオーバーライドするように正確に設計されています。

+0

問題は、macwireがどのSeq [EssentialFilter]を他の場所で選択するかを知りません。 –

+0

@PaulDraper、 "どこに?"と正確にどこにあるのか教えてください。私は 'レイジーヴァル'を非公開にすることはこれを避けるべきだと思います – SergGr

関連する問題