如何重用scala slick“withSession {implicit session:Session =>”代码块

时间:2014-12-17 13:43:00

标签: scala slick

我使用scala

slick中使用了此代码
def insertTask(task: Task) = {
  conn.dbObject withSession { implicit session: Session =>
    tasks.insert(task)
  }
}

看起来有效:)

现在我还要提供readTask的代码,我不想复制withSession { implicit...的代码

所以我想到了这样做:

def doWithConn(dbConn: DBConnection, doThisCodeBlock: => Unit)(implicit session: Session) = {
  dbConn.dbObject withSession { implicit session: Session =>
    doThisCodeBlock
  }
}

现在我的代码看起来像

def insertTask(task: Task) = {
  doWithConn(conn, tasks.insert(task)) // here i get the following complication error
}

但是我收到以下编译错误:

  

错误:(36,34)找不到参数会话的隐含值:scala.slick.jdbc.JdbcBackend #SessionDef           doWithConn(conn,tasks.insert(task))                                        ^

我不确定如何从session方法传递insertTask。如何传递它并修复此编译错误?

感谢

2 个答案:

答案 0 :(得分:2)

withSession是一个方法,它将会话中的函数作为参数。 syntax { implicit session => }只是为了隐藏会话。但你也可以传递一个函数:

val yourBlock: Session => ... = ...

db.withSession(yourBlock)

无需包装它,只需按原样使用它:)。

克里斯

答案 1 :(得分:0)

我认为问题是你的doThisCodeBlock没有传递会话的概念。我认为更好的方法是简单地使用currying来重用使用会话的语句:

def insertTaskStatement(task: Task)(implicit session: Session) = {
    tasks.insert(task)
}

def insertOtherThingStatement(otherThing: OtherThing)(implicit session: Session) = {
    things.insert(otherThing)
}

def insertTaskAndOtherThing(task: Task,otherThing: OtherThing) = {
  conn.dbObject withSession { implicit session: Session =>
    insertTaskStatement(task)
    insertOtherThingStatement(otherThing)
  }
}