我正在做一个 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
(我想)这种方法的问题是我需要为调用 MyDAO.findAll 的每个控制器操作编写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 模式的好机会。