作为一个最简单的例子,假设我正在以某种模式(例如测试)启动我的应用程序,然后我希望能够检查应用程序的其他部分我正在运行什么模式。这应该非常简单,但是我正在为全局变量寻找合适的 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 实例有关。这是否会导致可扩展性问题。
有没有更好的方法来解决问题?