6

これは通常、単純な問題ですが、型に依存することを考えると、Scala でこれを解決する方法が完全にはわかりません。MongoDB インスタンスへの単純な接続をセットアップするクラスがあります。現在、ローカルで、本番構成行をコメントアウトし、ローカル/開発行のコメントを外すというひどい考えを実行しています。それぞれの外観は次のとおりです。

// 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 に渡さないという事実を処理する方法です。

ここで typesafe の config のようなツールをどのように使用できますか? ローカル db 接続のために空の List/array を MongoConnection() に渡すことができると仮定していますが、mongoDb 関数を変更せずに運用データベースを構成する方法が完全にはわかりません。このプロセスを支援するために、次のようなツールを検討してきました: https://github.com/typesafehub/config

4

1 に答える 1

10

この目的のために、タイプセーフ構成を使用できます。
クラスパスに存在する必要がある application.conf というファイルを定義する必要があります。
typesafe config は、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
 }
} 
于 2013-09-07T02:13:54.777 に答える