设计模式以更改生产和测试环境的数据库

时间:2012-11-05 15:31:56

标签: scala slick

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

如果我有各种类似于生产的源文件:

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找到了我想要的内容。它真的把它分开了!几个星期前我在这些例子中进行过工作,但是不记得我在哪里看到了这个。

1 个答案:

答案 0 :(得分:1)

你可以建立在scala允许你使用" import"嵌套在类,对象或特征中(而不仅仅是在根级别):

使用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。