2013-09-07 8 views
5

これは通常はまっすぐな問題ですが、型の影響を受けているので、これをScalaでどのように解決するかは十分にはわかりません。 MongoDBインスタンスへの簡単な接続を設定するクラスがあります。現時点ではローカルで、私はプロダクションの設定行をコメントアウトし、ローカルの/ devのコメントを外すという凄い考え方をしています。ここでは、各1は次のようになります。限りで渡されたデータベース名の取得などでtypesafeの設定を使用してデータベース接続を管理する

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

、それは簡単だ - それだけで設定ファイルから文字列をつかみました。 MongoConnection()を初期化するためにList of ServerAddressインスタンスを使用することと、ローカル/ devセットアップでListをMongoConnectionに渡さないことを処理する方法は、きれいなソリューションを考えることができないところです。

ここでtypesafeの設定のようなツールを使用するにはどうすればよいですか?私は空のリスト/配列をローカルdb接続のためにMongoConnection()に渡すことができると仮定していますが、mongoDb関数を変更せずに本番データベースをどのように設定できるかは完全にはわかりません。私はこのようなプロセスを手助けするためのツールを探しています:https://github.com/typesafehub/config

答えて

9

この目的のためにタイプセーフな設定を使用することができます。
classpathに存在するapplication.confというファイルを定義する必要があります。 application.confに定義された構成を読み取ることで
タイプセーフコンフィグ作品、reference.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 
    } 
    } 
} 
のような設定値を定義する必要がありapplication.confというファイルを作成します値を読み取るための

コードは、これは正しい軌道に乗っているこの

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

ようになりますが、あなただけのMongoConnectionにリストを渡すことはできませんので、それは動作しません。 ServerAddressインスタンスのリストが必要です。 – randombits

+0

私はあなたの要求を正しく受けたかどうかはわかりません。私はこのソリューションを少し修正しました。構成ファイル内でユーザー定義のクラス/タイプを使用することはできません。 –

関連する問題