我在我的Lift scala应用程序中使用Slick框架。此框架要求在所有DDL对象中都存在ExtendedProfile.simple._。目前我把它定义为
trait DatabaseProvider {
val profile : ExtendedProfile
}
trait PersistUser {
this : DatabaseProvider =>
import profile.simple._
object Users extends Table[(String, String, Boolean)]("user") {
// various definitions are here
}
}
我想要的是将对象用户移到特征之外,所以我可以在表格连接的不同特征中单独使用它。但我不知道如何让Users对象依赖于ScopeProvider在范围内的存在,并导入所有必需的东西。
请建议。
答案 0 :(得分:1)
你可以这样,虽然我不确定这是你想要做的100%。这里的想法是,您可以首先定义一个通用模式,其中包含不同数据库提供程序之间不同的所有表定义。然后,您可以扩展您希望支持的每个数据库提供程序,设置实际需要的object
表定义。这样可以让您灵活地动态指定ExtendedProfile
,我认为这是您的目标。我知道这个编译,但我没有尝试运行它。我想我会把它留给你。
import scala.slick.driver.ExtendedProfile
import scala.slick.session.Session
abstract class Schema(val profile:ExtendedProfile){
import profile.simple._
abstract class UsersModel extends Table[(String, String, Boolean)]("user") {
def name = column[String]("name", O.PrimaryKey)
def email = column[String]("email")
def valid = column[Boolean]("valid")
def * = name ~ email ~ valid
}
val Users:UsersModel
}
object MySqlSchema extends Schema(scala.slick.driver.MySQLDriver){
object MySqlUsers extends UsersModel
val Users:UsersModel = MySqlUsers
}
class UserDAO(schema:Schema)(implicit sess:Session){
import schema.profile.Implicit._
def findAllUsers = {
val q = for(u <- schema.Users) yield u
q.list
}
}
答案 1 :(得分:0)
而不是一个对象,将它设为class Users(dbProvider: DatabaseProvider) extends Table
...或者给它与PersistUser相同的自我类型