最も簡単な例として、特定のモード (テストなど) でアプリケーションを起動している場合、アプリケーションの他の部分で実行中のモードをチェックできるようにしたいとします。これは非常に単純なはずですが、グローバル変数の適切な 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 つだけ実行していることに関係していると思います。これにより、スケーラビリティの問題が発生する可能性があります。
問題を解決するためのより良い方法はありますか?