【问题标题】:Design pattern to change database for production and test environments为生产和测试环境更改数据库的设计模式
【发布时间】:2012-10-25 11:24:09
【问题描述】:

我需要导入不同的库并根据我的源代码的用途做一些稍微不同的事情,即运行和测试。

如果我有各种看起来像这样的源文件用于生产:

import scala.slick.driver.PostgresDriver.simple._
import Database.threadLocalSession

case class SomeBusinessObject(...)

有什么好方法可以将其更改为以下进行测试(意味着我想在测试期间使用不同的数据库):

import scala.slick.driver.h2.simple._
import Database.threadLocalSession

case class SomeBusinessObject(...)

哦,还有一个数据库类来保存我正在使用的任何数据库的密钥:

import scala.slick.driver.PostgresDriver.simple._

// Use the implicit threadLocalSession
import Database.threadLocalSession

object DB{

  val get = {
      Database.forURL("jdbc:postgresql:test:slick",
                           driver="org.postgresql.Driver",
                           user="postgres",
                           password="xxxx") 
  }
}

我做了一些研究,看起来蛋糕模式可能是这类事情的关键,但如果有人能帮助我开始,那就太好了(如果蛋糕是正确的方法)

更新:

自从提出这个问题后,我在Slick examples 中找到了我想要的东西。它真的把它分开了!几周前我研究了这些例子,但不记得我在哪里看到的。

【问题讨论】:

标签: scala slick


【解决方案1】:

您可以建立在 scala 允许您使用嵌套在类、对象或特征中的“导入”这一事实(而不仅仅是在根级别):

scala.collection.mutable.Map 和 scala.collection.immutable.Map 的示例(假设我们想在测试中使用不可变版本的 Map,在生产中使用可变版本)

scala> trait Import1 {
     | import scala.collection.mutable.{Map => iMap}
     | def Test = iMap(1 -> "a")
     | }
defined trait Import1

scala> trait Import2 {
     | import scala.collection.immutable.{Map => iMap}
     | def Test = iMap(1 -> "a")
     | }
defined trait Import2

现在你可以这样做了:

scala> object ProductionThing extends Import1
defined module ProductionThing

scala> ProductionThing.Test
res6: scala.collection.mutable.Map[Int,java.lang.String] = Map(1 -> a)

scala> object TestingThing extends Import2
defined module TestingThing

scala> TestingThing.Test
res7: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> a)

或者您可以使用相同的机制在一个类中确定您的导入范围并将该类注入到 SomeBusinessObject。

【讨论】:

  • 感谢 Paolo 的精彩解释。我还发现了作为 Slick 库的一部分实现的蛋糕模式的一个很好的例子。所以我根本不用自己烤 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2013-11-05
  • 2010-11-23
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多