Slide 1

Slide 1 text

by TakeoSuzuki

Slide 2

Slide 2 text

自己紹介 Scala歴4ヶ月 3月からChatworkでアルバイト

Slide 3

Slide 3 text

@taroleoさんが開発していたライブラリ Scalaアプリケーション開発に便利 その中の一つがDIライブラリ

Slide 4

Slide 4 text

複数の実装があるとき

Slide 5

Slide 5 text

trait DataBase { def write(text: String): Unit } class RealDB() extends DataBase { override def write(text: String): Unit = println(s"$text を本番用DBに書き込みました!") } class TestDB() extends DataBase { override def write(text: String): Unit = println(s"テスト環境のため $text は書き込みしてません!") } trait MyApp { val db = bind[DataBase] } val d = newDesign .bind[DataBase].to[RealDB] d.build[MyApp] { app => app.db.write("お試し") // お試し を本番用DBに書き込みました! // TestDB =>テスト環境のため お試し は書き込みしてません! }

Slide 6

Slide 6 text

RealDB、TestDBを変えるだけで 実装を切り替えることができる

Slide 7

Slide 7 text

同一のBindが複数ある時

Slide 8

Slide 8 text

trait MyApp { val firstName = bind[String] val lastName = bind[String] } val d = newDesign .bind[String].toInstance("Takeo") .bind[String].toInstance("Suzuki") d.build[MyApp] { app => println(app.firstName) //Takeo println(app.lastName) //Suzuki } d.build[MyApp] { app => println(app.firstName) //Suzuki println(app.lastName) // Suzuki } 予想 結果

Slide 9

Slide 9 text

• 後が優先される • その型のフィールド全てに適用

Slide 10

Slide 10 text

MyAppに未定義のメソッドがある時

Slide 11

Slide 11 text

trait MyApp { val firstName = bind[String] val lastName = bind[String] def f(x: Int): Int } class MyAppImpl extends MyApp { override def f(x: Int): Int = x + 1 } val d = newDesign .bind[String].toInstance("Takeo") .bind[MyApp].to[MyAppImpl] d.build[MyApp] { app => println(app.firstName) // Takeo println(app.lastName) // Takeo println(app.f(10)) //11 } これでいいのか・・・

Slide 12

Slide 12 text

val db: DataBase = new RealDB() val d = newDesign.bind[DataBase].to[RealDB]

Slide 13

Slide 13 text

No content