2013-09-07 27 views
5

Zwykle jest to prosty problem, ale nie jestem do końca pewien, jak rozwiązać ten problem w Scali, ponieważ jest on wrażliwy na typ. Mam klasę, w której skonfigurowałem proste połączenie z moją instancją MongoDB. Teraz na miejscu, robię boga straszne pojęcie tylko komentowanie linii konfiguracji produkcji i odkomentowanie lokalnych/dev. Oto, co każdy z nich wygląda tak:Używanie konfiguracji typesafe do zarządzania połączeniem z bazą danych

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

W miarę coraz nazwę bazy danych przekazywanych w, to banalne - to jest po prostu chwytając ciąg z pliku konfiguracyjnego. Gdzie nie jestem w stanie myśleć o czystym rozwiązaniu, jest to, jak sobie poradzić z tym, że używam instancji List of ServerAddress do zainicjowania MongoConnection() vs nie przekazywanie żadnej Listy do MongoConnection w konfiguracji lokalnej/dev.

Jak korzystać z narzędzia takiego jak config typesafe? Zakładam, że mogę po prostu przekazać pustą listę/tablicę do MongoConnection() dla lokalnego połączenia db, ale nie jestem do końca pewien, jak mogę skonfigurować produkcyjną bazę danych bez modyfikowania funkcji mongoDb. Szukałem takiego narzędzia, które pomogłoby mi w procesie: https://github.com/typesafehub/config

Odpowiedz

9

Do tego celu można użyć typu safe config.
Będziesz musiał zdefiniować plik o nazwie application.conf, który powinien znajdować się w ścieżce klas.
Typesafe prace konfiguracyjne czytając konfiguracje zdefiniowane w application.conf, reference.conf itp
Więc najpierw utworzyć plik o nazwie application.conf które powinny znajdować się w ścieżce klasy aplikacji i określenia wartości konfiguracyjnych tak

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

Kod do odczytu wartości będzie wyglądać następująco

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

to jest na dobrej drodze, ale to nie będzie działać, ponieważ nie można po prostu przekazać listę do MongoConnection. Oczekuje listy instancji ServerAddress. – randombits

+0

Nie jestem pewien, czy poprawnie spełniłem twoje wymagania. Ja nieznacznie zmodyfikowałem rozwiązanie. Nie można używać żadnych zdefiniowanych przez użytkownika klas/typów w pliku konfiguracyjnym. –