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

时间:2014-02-17 00:56:45

标签: scala slick

这基本上是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中不够先进以实现它。

2 个答案:

答案 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)