0

我正在使用 cake 模式在 play 2.2.1 应用程序中注入组件之间的依赖关系。应用程序由播放控制器组成,我们使用自定义ActionBuilder来打开我们的数据库会话。我们目前通过控制器和 DAO 层将该 DB 会话作为隐式参数一直传递回我们的模型层。(ActionBuilder -> 控制器 -> DAO -> Slick 模型)

我使用 play-slick 进行 slick 集成,并尝试使用 DAO 方法来封装对我们 slick 模型的访问。我们的 DAO 有几个函数定义,例如findById(id: Int)(implicit s: Session): Option[Entity]. 我想通过注入一个 DBSession 检索组件来避免每个函数定义中的隐式会话参数。每次都将在 DAO 功能块内调用此组件以检索当前请求数据库会话。

来自 Java 和 Spring 世界,鉴于我可能无法依赖任何 ThreadLocal 范围代理,我不知道如何实现这一点。

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

4

2 回答 2

1

You can put all of your methods into a class, that takes an implicit session as an argument and then you always first instantiate the class and then call a method. Example here: http://slick.typesafe.com/doc/2.0.2/connection.html#passing-sessions-around

于 2014-07-29T19:31:33.653 回答
0

如果您可以检索 DB Session 作为 Request 的函数,那么您可以提供一个隐式转换来转换 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)
  }
}

在我看来,这会更干净一些。

于 2014-07-29T17:33:42.073 回答