Play 2.5への移行では、(JDBC)データベースアクセスを含む依存性注入デザインパターンを採用しています。クラスレベルでケースクラス/コンパニオンオブジェクトパターンを使用する場合のScala依存性注入
、私が概念を理解:
class Users @Inject() (db: Database)
しかし、私はまだあなたがケースクラスのメソッド内でデータベースへのアクセスやコンパニオンオブジェクトパターンを必要とする場合は、この限りかもしれない方法の議論を見ていません。例えば、基本的なモデルビーイング:
package models
import anorm._
import anorm.SqlParser._
import javax.inject._
import play.api.db._
import play.api.libs.functional.syntax._
import play.api.libs.json._
case class User @Inject() (db: Database) (
id: Option[Long] = None,
email: String
) {
def save = {
id.map { id => User.findById(id) } match {
case None => create
case _ => update
}
}
def create = db.withConnection { implicit conn =>
SQL(
"""INSERT INTO users (email) VALUES ({email})"""
).on(
'email -> email
).executeUpdate()
this
}
def update = ...
}
object User {
val simple = {
get[Option[Long]]("id") ~
get[String]("email") map {
case id ~ email =>
User(id, email)
}
}
def findById(id: Long) = db.withConnection { implicit conn =>
SQL("""SELECT * FROM users WHERE id = {id}""").on('id -> id).as(User.simple.singleOpt)
}
}
これはケースクラス(val simple = { ... }
内それが使用できなくなる)の署名を変更し、そしてIは、コンパニオン・オブジェクトでDBにアクセス/注入する方法を見つけ出すことができません。オブジェクト内で@Inject() var db: Database _
を試してみると、避けたいNullPointerExceptionsの世界ができます。
依存性注入の世界でこの一般的な使用例に推奨されるデザインパターンは何ですか?
ケースクラスはそのような「サービス」機能をカプセル化するものではなく、DIはオブジェクトを扱うように設計されていません – cchantep