为什么在范围内没有.withSession,但是当一个特征时它可以正常工作?

时间:2015-01-13 19:17:15

标签: scala playframework slick

当我在特征中使用getDb()方法时,我对访问.withSession感到困惑。

trait BaseDao{
  private lazy val db = {

    DatabaseAccess.databases("db.default")
  }

  def getDb() = db
}

class UserDao extends BaseDao {

    def getById(id: Int): User = {
        getDb().withSession { implicit session => 
            return ...
        }
    }
}

DatabaseAccess reference

但是当我注入一个具有相同getDb()方法的类时,我没有.withSession可用,它说getDb()返回Unit:

class DbUtil {
  private lazy val db = {

    DatabaseAccess.databases("db.default")
  }

  def getDb() = db  
}

class UserDao(dbUtil: DbUtil) {

    def getById(id: Int): User = {
        dbUtil.getDb() ???  // .withSession isn't in scope
    }   

}

You can see withSession here.

我想从用户转移到传递DBUtil的特性,但是当我尝试时,.withSession不再在范围内了。

2 个答案:

答案 0 :(得分:0)

从您的第二个示例开始,getDb()超出范围,因为它是在DbUtil类上定义的。

因此,如果您想访问该方法,则需要在dbUtil实例上调用它:

class UserDao(dbUtil: DBUtil) {

    def getById(id: Int): User = {
        dbUtil.getDb().withSession { implicit session => ... }
    }   

}

答案 1 :(得分:0)

以下代码适用于我。

class Database {
  def withSession() {}
}
object DatabaseAccess {
  var databases: Map[String, Database] = Map()
}

class DbUtil {
  private lazy val db = {
    DatabaseAccess.databases("db.default")
  }

  def getDb() = db
}

class UserDao(dbUtil: DbUtil) {

  def getById(id: Int) = {
    dbUtil.getDb().withSession()
  }
}

可能是你的IDE出了问题。您是否测试过代码是否编译?