这通常是一个直接的问题,但我不完全确定如何在Scala中解决这个问题,因为它是类型敏感的。我有一个类,我设置一个简单的连接到我的MongoDB实例。现在在本地,我做了一个神奇的概念,只是评论生产配置行并取消注释本地/开发者。以下是每个人的样子:
// production
object MongoReplicaConnection {
def mongoDb = {
val addresses = List(new ServerAddress("10.1.1.2" , 27017), new ServerAddress("10.1.1.3" , 27017), new ServerAddress("10.1.1.4" , 27017))
val mongoConn = MongoConnection(addresses)
val db = mongoConn("mydb")
db
}
}
// local development
object MongoReplicaConnection {
def mongoDb = {
val mongoConn = MongoConnection()
val db = mongoConn("mydb_local")
db
}
}
就传入数据库名称而言,这是微不足道的 - 它只是从配置文件中获取一个字符串。我无法想到一个干净的解决方案是如何处理我使用List of ServerAddress实例初始化MongoConnection()与未在本地/ dev设置中将任何List传递给MongoConnection的事实。
如何在这里使用类型安全配置等工具?我假设我可以将一个空的List /数组传递给MongoConnection()以获取本地数据库连接,但我不完全确定如何在不修改mongoDb函数的情况下配置生产数据库。我一直在寻找一个这样的工具来帮助我完成这个过程:https://github.com/typesafehub/config
答案 0 :(得分:10)
您可以使用类型安全配置来实现此目的 您必须定义一个名为application.conf的文件,该文件应存在于类路径中 Typesafe配置通过读取application.conf,reference.conf等中定义的配置来工作 首先创建一个名为application.conf的文件,该文件应位于应用程序类路径中 并定义像这样的配置值
com.company.application {
production {
mongodb {
servers=["10.1.1.2", "10.1.1.3"]
password=pwd
}
}
development {
mongodb {
servers=["10.1.1.2", "10.1.1.3"]
password=pwd
}
}
local {
mongodb {
servers=["127.0.0.1."]
password=pwd
}
}
}
读取值的代码看起来像这样
import com.typesafe.config.ConfigFactory
import com.typesafe.config.Config
object MongoReplicaConnection {
def mongoDb = {
val configNamespace = "com.company.application"
val mergedCfg = ConfigFactory.load().getConfig(configNamespace)
val env = getEnvironment // a util function, returns development or productoin or local
// environment can be passed as jvm args and read from System properties
val envCfg = mergedCfg.getConfig(env)
val serverCfg = envCfg.getConfig("mongodb")
val servers = serverCfg.getStringList("servers")
// Servers will be a returned as List of Strings
val pwd = serverCfg.getString("password")
val addresses = servers map { new ServerAddress(_ , 27017) }
val mongoConn = MongoConnection(addresses)
val db = mongoConn("mydb")
db
}
}