2013-09-07 14 views
5

Questo è normalmente un problema semplice, ma non sono completamente sicuro su come risolvere questo problema in Scala dato che è sensibile al testo. Ho una classe in cui ho impostato una semplice connessione alla mia istanza MongoDB. Proprio ora a livello locale, faccio la pessima idea di dio semplicemente commentando le linee di produzione e disapprovando le/dev locali. Ecco quello che ognuno appare come:Uso della configurazione di typesafe per gestire la connessione al mio database

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

Nella misura in cui ottenere il nome del database in passato, questo è banale - è solo afferrare una stringa dal file di configurazione. Dove non sono in grado di pensare a una soluzione pulita è come gestire il fatto che utilizzo un elenco di istanze di ServerAddress per inizializzare MongoConnection() rispetto a non passare alcun Elenco a MongoConnection in una configurazione locale/dev.

Come si può utilizzare uno strumento come la configurazione di typesafe qui? Suppongo di poter passare una lista/array vuota a MongoConnection() per una connessione db locale, ma non sono del tutto sicuro di come posso configurare il database di produzione senza modificare la funzione mongoDb. Ho cercato uno strumento come questo per aiutarmi con il processo: https://github.com/typesafehub/config

risposta

9

È possibile utilizzare il tipo safe config per questo scopo.
Dovrai definire un file chiamato application.conf che dovrebbe essere presente nel classpath.
opere di configurazione tipizzate leggendo configurazioni definite nel application.conf, reference.conf ecc
Quindi, prima di creare un file chiamato application.conf che dovrebbe essere in applicazione classpath e definire i valori di configurazione come questo

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

codice per leggere i valori sarà simile a questa

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 
} 
} 
+0

questo è sulla strada giusta, ma non funzionerà perché non si può semplicemente passare un elenco di MongoConnection. Si aspetta un elenco di istanze ServerAddress. – randombits

+0

Non sono sicuro se ho ricevuto correttamente la tua richiesta. Ho leggermente modificato la soluzione. Non è possibile utilizzare classi/tipi definiti dall'utente all'interno del file di configurazione. –