Scala 仅使用类名字符串创建对象的实例。

Scala 仅使用类名字符串创建对象的实例。,scala,playframework-2.0,slick,Scala,Playframework 2.0,Slick,我是scala的新手,我想边走边想办法。我正在使用Play2.x框架,并使用Scala构建我的应用程序。我已经确定了路线 GET /:tableName controllers.Application.getTable(tableName) 在控制器中,我希望使用表的名称,并像使用类一样使用它。例如,在db if中,有一个名为People的表。我希望它映射到具有getAll函数的用户的光滑模型。我研究了t型,但没能使它工作。下面是我想做的一个例子 def getTable(tableNam

我是scala的新手,我想边走边想办法。我正在使用Play2.x框架,并使用Scala构建我的应用程序。我已经确定了路线

GET /:tableName   controllers.Application.getTable(tableName)
在控制器中,我希望使用表的名称,并像使用类一样使用它。例如,在db if中,有一个名为People的表。我希望它映射到具有getAll函数的用户的光滑模型。我研究了t型,但没能使它工作。下面是我想做的一个例子

def getTable(tableName: String) = Action {

    Ok(Json.toJson(typeOf[tableName].getAll))
  }

要完成这项任务,您需要的不仅仅是这些;)首先,Slick需要一个DB会话,因此需要在某个地方进行处理。这意味着一个光滑的表
getAll
本身无法工作

我会这样做(抱歉,在没有IDE的情况下键入此项,因此它可能无法编译):


我有一个模型,看起来和你上面的相似。问题是我有几个定义了.getAll的模型。我希望使用字符串传入对象的名称,并调用.getAll以获得适当的方法。您能否将
.getAll
概括为
DAO
所具有的特征?
case class Person(...)
object People extends Table[Person](PeopleDAO.table) {
  def * = ...
}

trait DAO[T] {
  val table: String
  def getAll: Seq[T]
}

object PeopleDAO extends DAO[Person] {
  override val table = "people"
  def getAll = {
    DB withSession { implicit session =>
      Query(People).list
    }
  }
}
object Controller {
  def getTable(tableName: String) = Action {
    val dao: DAO[_] = tableName.toLowerCase match {
      case PeopleDAO.table => PeopleDAO
      case _ => throw new IllegalArgumentException("Not a valid table.")
    }
    Ok(Json.toJson(dao.getAll))
  }
}