2

最も簡単な例として、特定のモード (テストなど) でアプリケーションを起動している場合、アプリケーションの他の部分で実行中のモードをチェックできるようにしたいとします。これは非常に単純なはずですが、グローバル変数の適切な Scala 置換を探しています。「Scala オブジェクトはグローバル変数のようなものです」よりももう少し教えてください。

理想的な解決策は、起動時にアプリケーションがオブジェクトを作成し、作成時にそのオブジェクトの「モード」が設定されることです。その後、アプリケーションの他の部分は「モード」の状態を読み取ることができます。アプリケーション全体でオブジェクトへの参照を渡さずにこれを行うにはどうすればよいですか?

私の実際のシナリオには、起動時にデータベース名またはシングルトン データベース オブジェクトを選択し、後でそのオブジェクトを変更できないようにすることが含まれます。1 つの問題は、データベースへの参照を渡さずにこれを達成しようとしていることです。

アップデート:

これが私がやりたいことと私の現在の解決策の簡単な例です:

object DB{
  class PDB extends ProductionDB
  class TDB extends TestComplianceDB
  lazy val pdb = new PDB
  lazy val tdb = new TDB
  def db = tdb //(or pdb) How can I set this once at initialisation?
}

そのため、さまざまなデータベース構成を特性として作成しました。テスト モードと本番モードのどちらで実行しているかに応じて、構成が次のような正しい構成を使用したいと考えています。

trait TestDB extends DBConfig {
  val m = new Model("H2", new DAL(H2Driver),
    Database.forURL("jdbc:h2:mem:testdb", driver = "org.h2.Driver"))

  // This is an in-memory database, so it will not yet exist.
  dblogger.info("Using TestDB")
  m.createDB
}

したがって、データベースを使用するときはいつでも、次のように使用できます。

val m = DB.db.m
m.getEmployees(departmentId)

私の質問は、このスタイルが悪いのか、良いのか、それとも大丈夫なのかです (データベースへのハンドルを保持するためにシングルトンを使用しています)。私は Slick を使用していますが、これは Slick のインスタンスを 1 つだけ実行していることに関係していると思います。これにより、スケーラビリティの問題が発生する可能性があります。

問題を解決するためのより良い方法はありますか?

4

1 に答える 1

4

typesafe config libraryを使用できます。これは、Play や​​ Akka などのプロジェクトでも使用されています。Play と Akka の両方のドキュメントで、その使用法の基本的な部分が説明されています。Playのドキュメントから(追加の構成)

代替構成ファイルの指定

デフォルトでは、クラスパスから application.conf ファイルをロードします。必要に応じて、別の構成ファイルを指定できます。

-Dconfig.resource の使用

-Dconfig.resource=prod.conf

-Dconfig.file の使用

-Dconfig.file=/opt/conf/prod.conf

-Dconfig.url の使用

-Dconfig.url= http://conf.mycompany.com/conf/prod.conf

次のような include ディレクティブを使用して、新しい prod.conf ファイルで元の構成ファイルをいつでも参照できることに注意してください。

include "application.conf"

key.to.override=blah

于 2013-03-19T07:45:25.617 に答える