2015-01-13 20 views
1

当我在特质中使用getDb()方法时,我感到困惑,因为我有权访问.withSession。为什么不在.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()返回单位:

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不再在范围内。

+0

我想你的第二个例子中有另一个错字。你传入'UserDao'类的参数是'DBUtil'类型(注意大写'B'),而你实际上需要'DbUtil'(小写'b')。 – edi

+0

@edi ok修复了这个错别字的错误,但仍然停留在为什么我无法访问.withSession。 – Blankman

回答

0

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

所以,如果你想访问的方法,你需要调用它的dbUtil实例:

class UserDao(dbUtil: DBUtil) { 

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

} 
+0

对不起,这是我做的,我更新了我的代码。 – Blankman

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的问题。你测试过代码是否编译?

相关问题