2013-09-07 7 views
5

Dies ist normalerweise ein einfaches Problem, aber ich bin nicht ganz sicher, wie man das in Scala löst, da es typengerecht ist. Ich habe eine Klasse, in der ich eine einfache Verbindung zu meiner MongoDB-Instanz eingerichtet habe. Gerade jetzt lokal mache ich die gottgläubige Vorstellung, einfach die Produktionskonfigurationszeilen zu kommentieren und die lokalen/dev-Zeilen auszukommentieren. Hier ist, was jeder sieht aus wie:Verwenden von typesafe config zum Verwalten meiner Datenbankverbindung

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

Soweit den Namen der Datenbank immer übergeben, das ist trivial - es ist nur eine Zeichenfolge aus der Konfigurationsdatei greifen. Wo ich nicht an eine saubere Lösung denken kann, ist die Tatsache, dass ich eine Liste von ServerAddress-Instanzen verwende, um MongoConnection() zu initialisieren oder keine List an MongoConnection in einem lokalen/dev-Setup zu übergeben.

Wie können Sie ein Tool wie die Konfiguration von typesafe hier verwenden? Ich gehe davon aus, dass ich eine leere List/Array für eine lokale db-Verbindung einfach an MongoConnection() übergeben kann, aber ich bin mir nicht ganz sicher, wie ich die Produktionsdatenbank konfigurieren kann, ohne die mongoDb-Funktion zu ändern. Ich habe mir ein Tool wie dieses angesehen, um mir bei dem Prozess zu helfen: https://github.com/typesafehub/config

Antwort

9

Sie können den Typ Safe Config für diesen Zweck verwenden.
Sie müssen eine Datei namens application.conf definieren, die in Ihrem Klassenpfad vorhanden sein sollte.
Typsichere Config Werke von Konfigurationen definiert in application.conf Lesen, reference.conf usw.
So erstellen Sie zuerst eine Datei application.conf genannt, die in Anwendung Classpath wie diese

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 
    } 
    } 
} 
und definieren Sie die Konfigurationswerte sollten

-Code die Werte lesen

wie folgt aussehen
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

dieses auf dem richtigen Weg ist, aber es wird nicht funktionieren, weil Sie nicht nur eine Liste zu MongoConnection passieren kann. Es erwartet eine Liste von ServerAddress-Instanzen. – randombits

+0

Ich bin mir nicht sicher, ob ich Ihre Anforderung richtig erhalten habe. Ich habe die Lösung leicht modifiziert. Sie können keine benutzerdefinierten Klassen/Typen innerhalb der Konfigurationsdatei verwenden. –

Verwandte Themen