2

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

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

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 示例中找到了我想要的东西。它真的把它分开了!几周前我研究了这些例子,但不记得我在哪里看到的。

4

1 回答 1

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。

于 2012-11-05T16:51:09.780 回答