についての接続、あなたが彼らと一緒に行われたときに(プールに戻る)それらを閉じるする必要があり、それはミックスインする実装直交しています。
の構成と、そのようなに関しては、私はこのアプローチを好むが、それに伴う問題は、ほとんどの時間は、あなたがロードされたconfig
のようなものがシングルトンになりたいということですが、あなたは、単に
trait Configuration {
val config = loadConfig
}
class Foo with Configuration
class Bar with Configuration
val f1 = new Foo
val f2 = new Foo
val b1 = new Bar
val b2 = new Bar
ような何かを行う場合次に、あなたは設定の4つの異なるコピーをロードすることになります。この周り 一つの方法は、シングルトンオブジェクトにloadConfig
を委任することです:
object Configuration {
val config = loadConfig
}
trait Configuration {
def config = Configration.config
}
これは動作しますが、それはユニットテストをはるかに困難になり、私がしたい場合は、私の設定は時々、データベースからロードされたものを(機能を無効に? )
別の可能性は、プロキシクラスである:今
trait Configuration {
def loadConfig: Config
lazy val config: Config = loadConfig
}
class ConfigurationProxy(cfg: Configuration) extends Configuration {
def loadConfig = cfg.config
}
object Main extends App with Configuration {
def loadConfig = ??? // executed only one per application
...
}
class Foo extends ConfigurationProxy(Main)
class Bar extends ConfigurationProxy(Main)
val f1 = new Foo
val f2 = new Foo
val b1 = new Bar
val b2 = new Bar
、すべての4つの変数が同じConfig
インスタンスを見ています。 しかし、あなたはConfiguration
を望んでいるどこかの機能を持っている場合、あなたはまだ、これらのいずれかを渡すことができますなど
def connectToDB(cfg: Configuration) = ???
connectToDB(Main)
connectToDB(f1)
connectToDB(b2)