我使用cake模式在play 2.2.1应用程序中注入组件之间的依赖关系。应用程序由播放控制器组成,我们使用自定义ActionBuilder
打开我们的数据库会话。我们目前通过控制器和DAO层将该数据库会话一直传递回我们的模型层作为隐式参数。 (ActionBuilder - > Controller - > DAO - > Slick Model)
我使用play-slick进行光滑的集成,并尝试使用DAO方法封装对光滑模型的访问。我们的DAO有几个函数定义,如findById(id: Int)(implicit s: Session): Option[Entity]
。我想通过注入DBSession-retrieval组件来避免每个函数定义中的隐式会话参数。每次在DAO功能块内部调用此组件以检索当前请求数据库会话。
来自Java和Spring世界,我不知道如何实现这一点,因为我可能不能依赖任何ThreadLocal范围的代理。
知道我将如何实现这一目标吗? 这是好主意还是坏主意?
答案 0 :(得分:1)
您可以将所有方法放入一个类中,该方法将隐式会话作为参数,然后您始终首先实例化该类,然后调用方法。示例:http://slick.typesafe.com/doc/2.0.2/connection.html#passing-sessions-around
答案 1 :(得分:0)
如果您可以根据请求检索数据库会话,那么您可以提供隐式转换以转换Request => DBSession。
像这样:
implicit def request2DBSession(request: Request[T]): DBSession = ???
您可以在其中执行DBSession检索。
编辑:
更好的是,你可以使用动作组合为每个请求注入一个Session:
trait BaseController extends Controller {
def DBAction(f: (request[_]) => DBSession => Result) = {
Action { request =>
val dbSession = ??? // Lookup DBSession
f(request)(dbSession)
}
}
}
object Controller extends BaseController {
def lookupUser = DBAction { implicit request => implicit dbSession =>
??? // DBSession in Implicit Scope (free to use slick calls)
}
}
在我看来这会更清洁。