1

これは、Scala Cake パターンを実装する初期の試みの 1 つです。

trait dbConfig {
  val m: Model = ???
}

trait testDB extends dbConfig {
  override val m = new Model(Database.forURL("jdbc:h2:mem:testdb", driver = "org.h2.Driver"))
  m.cleanDB
}

trait productionDB extends dbConfig {
  override val m = new Model(Database.forURL("jdbc:postgresql:silly:productionDB", driver = "org.postgresql.Driver"))
}

trait SillySystem extends HttpService with dbConfig {
....
// System logic
....
}

これにより、テスト中に次のようにサービスを使用できます。

class TestService extends SillySystem with testDB {
.....
}

そして、生産のためにこのように:

class ProductionService extends SillySystem with productionDB {
.....
}

これは機能しますが、正しく実行していますか?

4

1 に答える 1

3

aまたはでa をオーバーライドできますが、その逆はできないためDbConfig、抽象化して使用すると役立つ場合があります。def defvallazy val

SillySystemは ではないためDbConfig、継承の代わりに依存性注入を使用してください。

trait DbConfig {
  def m: Model // abstract
}

trait TestDB extends DbConfig {
  // you can override def with val
  val m = new Model(Database.forURL("jdbc:h2:mem:testdb", driver = "org.h2.Driver"))
  m.cleanDB
}

trait ProductionDB extends DbConfig {
  val m = new Model(Database.forURL("jdbc:postgresql:silly:productionDB", driver = "org.postgresql.Driver"))
}

trait SillySystem extends HttpService {
  this: DbConfig => // self-type. SillySystem is not a DbConfig, but it can use methods of DbConfig.
....
// System logic
....
}

val testService = new SillySystem with TestDB

val productionService = new SillySystem with ProductionDB

val wrongService1 = new SillySystem // error: trait SillySystem is abstract; cannot be instantiated
val wrongService2 = new SillySystem with DbConfig // error: object creation impossible, since method m in trait DbConfig of type => Model is not defined

val correctService = new SillySystem with DbConfig { val m = new Model(...) } // correct
于 2012-11-10T12:32:17.213 に答える