gpt4 book ai didi

scala - 为什么 Scala 找不到参数 scala.slick.session.Session 的隐式值?

转载 作者:行者123 更新时间:2023-12-04 14:28:43 24 4
gpt4 key购买 nike

我正在使用 Slick 1.0.1 运行 Scala Play 2.2 应用程序。我正在尝试将我所有的数据库调用包装到以后的尝试中,例如:

object DbTeachers extends Table[DbTeacher]("edu_teachers") {
...
def insertTeacher(school: Int, userId: String)
(implicit ec: ExecutionContext, db: Database) =
future { Try { db.withSession => { implicit s: Session =>
(DbTeachers.school ~ DbTeachers.teacher).insert(school, userId)
}}}
}

我发现模式 future { Try { db.withSession => { ACTUAL_CODE_GOES_HERE }}}造成困惑,我想将其抽象如下:
sealed class DbAsync[T](block: => T) {
import play.api.libs.concurrent.Execution.Implicits.defaultContext
implicit lazy val db = Database.forDataSource(DB.getDataSource())
def get: Future[Try[T]] = future { Try { db.withSession { implicit s: Session =>
block
}}}
}

object DbAsync {
def apply[T](block: => T): Future[Try[T]] = new DbAsync[T](block).get
}

然后我可以将我的 insertTeacher 函数写为:
def insertTeacher(school: Int, userId: String) = DbAsync {
(DbTeachers.school ~ DbTeachers.teacher).insert(school, userId)
}

然而,scala 编译器(2.10.2)提示这个: could not find implicit value for parameter session: scala.slick.session.Session
据我了解, insert()方法在 DbAsync 块内的作用域中确实有一个隐式 session 变量,并且因为它是按名称调用的参数,所以在 DbAsync 中调用它之前不应该对其进行实际评估,届时将有一个隐式 session 范围内的对象。

所以,我的问题是,我如何说服 Scala 编译器在范围内实际上有一个隐式的 Session 对象?

最佳答案

你的建议不正确。在哪里都没关系call-by-name参数将被评估。所有隐式参数都应在编译时在需要它们的地方解析。

你可以让它这样工作:

def dbAsync[T](block: Session => T): Future[Try[T]] = {
import play.api.libs.concurrent.Execution.Implicits.defaultContext
implicit lazy val db = Database.forDataSource(DB.getDataSource())
future { Try { db.withSession { block }}}
}

def insertTeacher(school: Int, userId: String) = dbAsync { implicit s: Session =>
(DbTeachers.school ~ DbTeachers.teacher).insert(school, userId)
}

请注意,您不需要类(class) DbAsync也不反对 DbAsync .

请注意,您不应该使用 defaultContext用于阻塞操作。您可以创建其他 ExecutionContext带有配置的线程池。

关于scala - 为什么 Scala 找不到参数 scala.slick.session.Session 的隐式值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20788950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com