这基本上是earlier question的重复,但对于 Slick-2 ,因为适用于v.1的答案不再适用。
简而言之,Slick文档建议做这样的事情
package models
import scala.slick.driver.H2Driver.simple._
class Pictures(tag: Tag) extends Table[(Int, String, String)](tag, "Pictures") {
def id = column[Int]("id", O.PrimaryKey)
def urlThumb = column[String]("urlThumb", O.NotNull)
def urlLarge = column[String]("urlLarge", O.NotNull)
def * = (id, urlThumb, urlLarge)
}
这是将代码直接绑定到H2Driver。我希望它与驱动程序无关,即使用任何JdbcProfile驱动程序。我发现这样做的唯一方法是将驱动程序传递给DAO类
class SlickDAO(val driver: JdbcProfile) {
import driver.simple._
问题在于我是否想要定义一些具有共享行为的特征,例如: CRUDSupport,我不能有特征的参数,我只能做一个抽象类。所以我很好奇用Slick-2编写DAL的推荐方式是什么?我确定它是Cake模式,但是我在Scala中不够先进以实现它。
答案 0 :(得分:1)
我不是特别了解Slick,但是有针对此问题的标准Scala方法。
我不能有这个特征的参数,我只能做一个抽象类
但你可以
trait SlickDAO {
val driver: JdbcProfile
import driver.simple._
...
}
以后
class SlickDAOImpl(val driver: JdbcProfile) extends SlickDAO
或
new SlickDAO {
val driver = ...
}
但是,在特征中使用抽象val
会导致初始化顺序出现问题,所以我更喜欢
trait SlickDAO {
// can still be implemented as a val
def driver: JdbcProfile
// can't import driver.simple._, you'll have to write the prefix explicitly
...
}
或
trait SlickDAO {
def getDriver: JdbcProfile
lazy val driver = getDriver
import driver.simple._
...
}
答案 1 :(得分:0)