2016-09-08 9 views
0

クラスの機能をカプセル化したいとしましょう。つまり、クライアントとこの特定のクラスの間にプロキシを導入したいとします。例えば、プレイのResultクラスには、次の方法があります。この特定のクラスを変更せずに機能を持つScalaクラスを拡張するには?

/** 
    * Adds headers to this result. 
    * 
    * For example: 
    * {{{ 
    * Ok("Hello world").withHeaders(ETAG -> "0") 
    * }}} 
    * 
    * @param headers the headers to add to this result. 
    * @return the new result 
    */ 
    def withHeaders(headers: (String, String)*): Result = { 
    copy(header = header.copy(headers = header.headers ++ headers)) 
    } 

はのは、私が直接このメソッドを使用する必要はありませんが、代わりに私はプロキシを使用したいと仮定しましょう。どのようにこれを実装することができ

Redirect(controllers.app.routes.Application.index).customWithHeaders(<XYZ>)

:?だからではなく、Redirect(controllers.app.routes.Application.index).withHeaders(<XYZ>)を呼び出すので、私はその後、.withHeaders(<XYZ>)を呼び出し、自分自身のメソッドを呼び出したいですかコントローラによって拡張される特性を実装することでこれを行うことができますか?スコープでResultUtilsと

答えて

1
import play.api.mvc.Result 

implicit class ResultUtils (result: Result) { 
    def withCustomHeaders(pairs: (String, String)*): Result = result.withHeaders(pairs: _*) 
} 

、あなたが今できることRedirect(something).withCustomHeaders

パッケージオブジェクト

package object common { 
    implicit class ResultUtils (result: Result) { 
     def withCustomHeaders(pairs: (String, String)*): Result = result.withHeaders(pairs: _*) 
    } 
} 

import common._ //import common and get this class in scope 

形質

trait Implicits { 
    implicit class ResultUtils (result: Result) { 
     def withCustomHeaders(pairs: (String, String)*): Result = result.withHeaders(pairs: _*) 
    } 
} 

class ApplicationController @Inject()() extends Controller extends Something with Implicits { 
    def fooAction = Action { Ok("bar").withCustomHeaders("foo" -> "bar") } 
} 
+0

助けてくれてありがとう!この「暗黙のクラス」をカプセル化して再利用可能にするうーん、簡単な方法はありますか?私はこれを使いたいコントローラを複数持っています。私はそれを形質で包むべきだと思いますよね? –

+1

@ジョンドーはい。これをパッケージオブジェクトの中に入れ、好きな場所にパッケージをインポートします – pamu

+1

@JohnDoeは 'package object solution'で答えを編集しました – pamu

関連する問題