0

私は次のように書かれた特性を持っています:

trait NewTrait { 
  def NewTrait(f: Request[AnyContent] => Result):  Action[AnyContent] = {
    Action { request =>
      implicit val newTrait = new model.helper.newTrait
      f(request) 
    }
  }
}

そして、その特性を使用し、暗黙のvalnewTraitをビューに渡そうとするコントローラー:

object Test extends Controller with NewTrait {

  def foo(num: Int) = NewTrait { request =>
    val view = (views.html.example.partials.viewWrap)       
    Ok(views.html.example.examplePage(views.html.shelfPages.partials.sidebar())
}

fooでは、newTraitはスコープに含まれませんが、スコープに含めるためのベストプラクティスは何でしょうか。受信した各リクエストに固有である必要があります。foo内から暗黙のvalを再宣言すると機能しますが、コントローラー内で毎回その宣言を繰り返す必要があり、トレイトでそれを隠すことができれば、コードははるかにきれいに見えます。トレイトの暗黙の値をコントローラーに渡す方法はありますか?

4

3 に答える 3

0

あなたが持つことができます:

trait NewTrait {
    def gotRequest(req:Request) = {
        implicit val newTrait = new model.helper.newTrait
        // don't have to pass the newTrait parameter here 
        // explicitly, it is used implicitly
        Whatever.f(request)
    }
}

と:

object Whatever {
    def f(req:Request)(implicit val newTrait:NewTrait) = {
        //newTrait is in scope here.

        //...the rest of your code
    }
}
于 2013-02-14T01:38:15.770 に答える
0

名前が少しわかりにくいと思いますが (おそらくサンプル コードです)、これを行う方法は次のとおりです。

trait NewTrait {
  def NewTrait(f: Request[AnyContent] => model.helper.newTrait => Result): Action[AnyContent] = {
    Action { request =>
      val newTrait = new model.helper.newTrait
      f(request)(newTrait)
    }
  }
}

そしてそれを使用するコードでは:

object Test extends Controller with NewTrait {
  def foo(num: Int) = NewTrait { request => implicit newTrait =>
    Ok
  }
}
于 2013-02-13T19:47:01.880 に答える
0

上記の val をフィールド変数にします。

trait NewTrait { 
  implicit val newTrait = new model.helper.newTrait
  ...
}

これで、メソッドfooスコープになります。

于 2013-02-13T18:49:03.143 に答える