Scala Slick 2:如何编写与DB无关的DAL代码

Scala Slick 2:如何编写与DB无关的DAL代码,scala,slick,Scala,Slick,这基本上是一个重复,但是关于Slick-2,因为对v.1有效的答案不再有效 简而言之,精巧的文档建议这样做 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 ur

这基本上是一个重复,但是关于Slick-2,因为对v.1有效的答案不再有效

简而言之,精巧的文档建议这样做

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)
}
这是将代码直接绑定到驱动程序。我希望它与驱动程序无关,即与任何JdbcProfile驱动程序一起工作。我发现的唯一方法是将驱动程序传递给DAO类

class SlickDAO(val driver: JdbcProfile) {
    import driver.simple._

问题是,如果我想用共享行为定义一些特征,例如CRUDSupport,我不能为该特征设置参数,我只能创建一个抽象类。因此,我很好奇,使用Slick-2编写DAL的推荐方法是什么?我确信这是蛋糕模式,但我在Scala方面还不够高级,无法实现它。

我不知道Slick的具体情况,但是有标准的Scala方法来解决这个问题

我不能为trait设置参数,我只能创建一个抽象类

但是你可以

trait SlickDAO {
  val driver: JdbcProfile

  import driver.simple._
  ...
}
后来

class SlickDAOImpl(val driver: JdbcProfile) extends SlickDAO

然而,在traits中使用abstract
val
s可能会导致初始化顺序出现问题,所以我更喜欢

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 {
  // 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._
  ...
}