2

作为一个最简单的例子,假设我正在以某种模式(例如测试)启动我的应用程序,然后我希望能够检查应用程序的其他部分我正在运行什么模式。这应该非常简单,但是我正在为全局变量寻找合适的 Scala 替代品。请给我更多信息:“Scala 对象就像全局变量”

理想的解决方案是在启动时,应用程序将创建一个对象,并在创建时设置该对象的“模式”。之后,应用程序的其他部分将只能读取“模式”的状态。如果不在整个应用程序中传递对对象的引用,我该如何做到这一点?

我的真实场景实际上包括诸如在启动时选择数据库名称或单例数据库对象之类的事情,并且之后不允许其他任何东西更改该对象。一个问题是我试图在不将该引用传递给数据库的情况下实现这一目标。

更新:

这是我想做的一个简单示例,以及我当前的解决方案:

object DB{
  class PDB extends ProductionDB
  class TDB extends TestComplianceDB
  lazy val pdb = new PDB
  lazy val tdb = new TDB
  def db = tdb //(or pdb) How can I set this once at initialisation?
}

因此,我创建了不同的数据库配置作为特征。根据我是在测试模式还是生产模式下运行,我想使用正确的配置,其中配置类似于:

trait TestDB extends DBConfig {
  val m = new Model("H2", new DAL(H2Driver),
    Database.forURL("jdbc:h2:mem:testdb", driver = "org.h2.Driver"))

  // This is an in-memory database, so it will not yet exist.
  dblogger.info("Using TestDB")
  m.createDB
}

所以现在,每当我使用数据库时,我都可以这样使用它:

val m = DB.db.m
m.getEmployees(departmentId)

我的问题真的是,这种风格是坏、好还是好(使用单例来保存数据库的句柄)。我正在使用 Slick,我认为这与只运行一个 Slick 实例有关。这是否会导致可扩展性问题。

有没有更好的方法来解决问题?

4

1 回答 1

4

您可以使用typesafe 配置库,这也用于 Play 和 Akka 等项目。Play 和 Akka 文档都解释了它的基本用法。来自Play 文档(附加配置)

指定替代配置文件

默认是从类路径加载 application.conf 文件。如果需要,您可以指定替代配置文件:

使用 -Dconfig.resource

-Dconfig.resource=prod.conf

使用 -Dconfig.file

-Dconfig.file=/opt/conf/prod.conf

使用 -Dconfig.url

-Dconfig.url= http://conf.mycompany.com/conf/prod.conf

请注意,您始终可以使用 include 指令在新的 prod.conf 文件中引用原始配置文件,例如:

include "application.conf"

key.to.override=blah

于 2013-03-19T07:45:25.617 回答