1

我目前正在尝试使用Play! Framework 2.2play-slick(主分支)。在 play-slick 代码中,我想覆盖驱动程序定义以添加 Oracle 驱动程序(我正在使用 slick-extension)。在我刚刚看到的 play-slick 的 Config.Scala 中/** Extend this to add driver or change driver mapping */...

我来自很远的地方(目前正在阅读 Scala 编程),所以有很多东西要学。所以我的问题是:

  1. 有人可以解释一下如何扩展这个 Config 对象吗?这个对象在其他类中使用... cake apttern 在这里有用吗?
  2. 说到蛋糕模式,我阅读了 play-slick 提供的计算机数据库示例。此示例使用蛋糕模式,import play.api.db.slick.Config.driver.simple._如果我使用 Oracle 驱动程序,我不能使用此导入,我错了吗?如何使用蛋糕模式来定义隐式会话?

非常感谢。等待你的建议,我还在家里研究 play-slick 代码:)

4

1 回答 1

0
  1. 要扩展 Config特征 ,我认为不需要蛋糕模式。您应该能够像这样创建 Config 对象:

    import scala.slick.driver.ExtendedDriver
    
    object MyExtendedConfig extends play.api.db.slick.Config {
       override def driverByName: String => Option[ExtendedDriver] = {name: String => 
         super.driverByName(name) orElse Map("oracledriverstring" -> OracleDriver).get(name)
       } 
    
       lazy val app = play.api.Play.current
       lazy val driver: ExtendedDriver = driver()(app)
    }
    

    为了能够使用它,您只需要做:import MyExtendedConfig.driver._而不是import play.slick.db.api.Config.driver._. 顺便说一句,我看到 driverByName 的类型可能是 Map 而不是 Function ,从而更容易扩展。虽然这不应该中断,但这样做会更容易。

  2. 我认为 Jonas Bonér 的旧博客是阅读蛋糕图案的好地方(http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/)。我对它的幼稚理解是,当您有使用以下self类型的图层时,您就有了蛋糕图案:

    trait FooComponent{ driver: ExtendedDriver =>
      import driver.simple._
      class Foo extends Table[Int]("") {
        //...
      }
    }
    

    slick/play-slick 中的 cake 模式有 2 个用例:1)如果您有引用其他表的表(如在计算机数据库示例中)2)准确控制在何时使用哪个数据库或是否您使用许多不同的类型。通过使用配置,您实际上并不需要蛋糕模式,只要您只有 2 个不同的数据库(一个用于生产,一个用于测试),这就是配置的重点。

希望这能回答您的问题并祝您在阅读 Scala 编程时好运(喜欢那本书 :)

于 2013-10-29T14:07:50.167 回答