DIライブラリ Airframeを使ってみた

 DIライブラリ Airframeを使ってみた

70867f635114322f11d3c2f14e302a40?s=128

takeosuzuki

April 25, 2019
Tweet

Transcript

  1. by TakeoSuzuki

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

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

  4. 複数の実装があるとき

  5. 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 =>テスト環境のため お試し は書き込みしてません! }
  6. RealDB、TestDBを変えるだけで 実装を切り替えることができる

  7. 同一のBindが複数ある時

  8. 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 } 予想 結果
  9. • 後が優先される • その型のフィールド全てに適用

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

  11. 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 } これでいいのか・・・
  12. val db: DataBase = new RealDB() val d = newDesign.bind[DataBase].to[RealDB]

  13. None