Использование конфигурации typesafe для управления подключением к моей базе данных

Обычно это прямая проблема, но я не совсем уверен, как решить ее в Scala, учитывая, что она чувствительна к типу. У меня есть класс, в котором я устанавливаю простое соединение с моим экземпляром MongoDB. Прямо сейчас локально я делаю ужасную идею, просто комментируя строки рабочей конфигурации и раскомментируя строки local/dev. Вот как выглядит каждый из них:

// 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
    }
}

Что касается передачи имени базы данных, это тривиально - это просто захват строки из файла конфигурации. Где я не могу придумать чистое решение, так это как справиться с тем фактом, что я использую список экземпляров ServerAddress для инициализации MongoConnection(), а не передавать какой-либо список в MongoConnection в локальной/dev-настройке.

Как вы можете использовать здесь такой инструмент, как конфигурация typesafe? Я предполагаю, что могу просто передать пустой список/массив в MongoConnection() для локального соединения с БД, но я не совсем уверен, как настроить производственную базу данных без изменения функции mongoDb. Я искал такой инструмент, чтобы помочь мне в этом процессе: https://github.com/typesafehub/config


person randombits    schedule 07.09.2013    source источник


Ответы (1)


Для этой цели вы можете использовать безопасный тип конфигурации.
Вам нужно будет определить файл с именем application.conf, который должен присутствовать в вашем пути к классам.
Конфигурация безопасного типа работает путем чтения конфигураций, определенных в 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
 }
} 
person Vishal John    schedule 07.09.2013
comment
Это правильный путь, но он не будет работать, потому что вы не можете просто передать список в MongoConnection. Ожидается список экземпляров ServerAddress. - person randombits; 07.09.2013
comment
Я не уверен, правильно ли я понял ваше требование. Я немного изменил решение. Вы не можете использовать какие-либо определенные пользователем классы/типы в файле конфигурации. - person Vishal John; 07.09.2013