如何在一个光滑的DAO组件中注入play.api.db.slick.Config.driver.simple.Session

时间:2014-07-29 16:44:12

标签: scala playframework-2.2 slick play-slick

我使用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范围的代理。

知道我将如何实现这一目标吗? 这是好主意还是坏主意?

2 个答案:

答案 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)
  }
}

在我看来这会更清洁。