2017-12-21 51 views
0

놀이방 웹 프레임 워크는 내가하고 싶은서브 클래스에서 macwire 주사제를 재정의하는 방법을

package play.api 

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

요청 (GZIP, 고르, 로깅 등)에 공통 처리를 수행하는 "필터"의 목록을 주입 할 수 있습니다 이 필터들의 일반적인 세트 (및 다른 것들). 서브 클래스에 의해 서브 클래스

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을 적절하게 다시 정의합니다. 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의 오버라이드 (override) 할 할 이유

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