私は play 2.1 プロジェクトに取り組んでおり、scala 設計の問題に関するガイダンスが必要です。このアプリケーションでは、着信リクエストからのクライアント情報を格納するリクエスト コンテキスト オブジェクトがモデル レイヤーで必要です。
case class ClientContext(clientName: String)
object ClientContext {
def apply(request: Request) = {
new ClientContext(request.params("clientName")) //pseudo code
}
}
私のモデル
object MyDAO {
def findAll(context: ClientContext) = { ... }
}
次に、コントローラーでモデルの dao メソッドに渡す必要があります。
object MyController extends Controller {
def index = Action { implicit request =>
val results = MyDAO.findAll(ClientContext(request))
Ok(results)
}
}
はクラスimplicit request
によって提供されますAction
(私はそう思います) 。implicit request =>
ClientContext(request)
Action ラッパーと暗黙的な値を使用してコードを改善する方法はありますか? context: ClientContext
メソッドで暗黙的なパラメーターとして宣言しMyDAO.findAll
、次の方法でアクションを記述できるようにしたいと考えています。
object MyDAO {
def findAll(implicit context: ClientContext) = { ... }
}
def index = ActionWithContext {
val results = MyDAO.findAll
Ok(results)
}
それを達成するためにActionWithContext(適用メソッドを持つメソッドまたはオブジェクト)を書くことは可能ですか?私が今持っている最も近いものは次のとおりです
def ActionWithContext(action: ClientContext => Result) = {
Action { implicit request =>
action(ClientContext(request))
}
}
利用方法
def index = ActionWithContext { context =>
val results = MyDAO.findAll(context)
Ok(results)
}
この設計を改善するための提案は役に立ちます。ありがとう!
PS: 正直なところ、これが Java の場合はコードをさらに単純化することは考えませんが、scala であるため、いくつかの scala パターンを学ぶ良い機会になるかもしれないと考えました。