【问题标题】:Slick 2: How to write DB-agnostic DAL codeSlick 2:如何编写与 DB 无关的 DAL 代码
【发布时间】:2014-02-17 00:56:45
【问题描述】:

这基本上是 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,我不能对 trait 有论据,我只能做一个抽象类。所以我很好奇用 Slick-2 编写 DAL 的推荐方式是什么?我确定这是 Cake 模式,但我在 Scala 中还不够先进,无法实现它。

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    我不具体了解 Slick,但有标准的 Scala 方法来解决这个问题。

    我不能为 trait 提供参数,我只能做一个抽象类

    但你可以拥有

    trait SlickDAO {
      val driver: JdbcProfile
    
      import driver.simple._
      ...
    }
    

    以后

    class SlickDAOImpl(val driver: JdbcProfile) extends SlickDAO
    

     new SlickDAO {
       val driver = ...
     }
    

    但是,在特征中使用抽象vals 可能会导致初始化顺序出现问题,所以我更喜欢

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

    【讨论】:

    【解决方案2】:
    猜你喜欢
    • 2012-12-09
    • 2012-11-27
    • 2020-10-07
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多