2

scaldi依存性注入でscalaオブジェクトに注入することは可能ですか? もしそうなら、どうすればインジェクターを手に入れることができますか?

シングルトンでなければならないSignUpFormオブジェクトがあります...

object SignUpForm {

  val form = Form(
    mapping(
      "firstName" -> nonEmptyText,
      "lastName" -> nonEmptyText,
      "email" -> email.verifying(Constraints.userExists),
      "password" -> mapping (
        "main" -> nonEmptyText.verifying(Constraints.passwordLenth),
        "confirm" -> nonEmptyText
      )(Password.apply)(Password.unapply).verifying(Constraints.passwordConfirmation)
    )(Data.apply)(Data.unapply)

  )

  case class Password(
    main: String,
    confirm: String
  )

  case class Data(
    firstName: String,
    lastName: String,
    email: String,
    password: Password
  )
}

...そしてオブジェクトの制約

object Constraints {

  val userService = inject[UserService]

  def passwordConfirmation: Constraint[Password] = Constraint("password.confirm"){ password =>
    if (password.main.equals(password.confirm)) Valid else Invalid(Seq(ValidationError("password doesnt equal the confirmation password", "password.main", "confirm")))
  }

  def passwordLenth: Constraint[String] = Constraint("password.length"){ password =>
    if (password.length >= 8) Valid else Invalid(Seq(ValidationError("The minimum password length is " + 8 + " characters", "password.main", "length")))
  }

  def userExists: Constraint[String] = Constraint("user.exists"){ email =>
    if (userExistsWithEmail(email.toLowerCase)) Valid else Invalid(Seq(ValidationError("The user with email " + email + " already exists", "user", "email")))
  } ...

ここに問題があります->ユーザーサービスを注入する必要がありますが、コンストラクター引数として暗黙のインジェクターが渡されない限り注入できません(ここにオブジェクトがあるため、これは不可能です)

...
private def userExistsWithEmail(email: String):Boolean = {
    val result = Await.result(userService.retrieve(LoginInfo(CredentialsProvider.Credentials, email)),1 seconds)

     result match {
      case Some(u) => true
      case None => false
    }
  }
}

...どうすればこの問題を解決できますか?

前もって感謝します

4

1 に答える 1

2

あなた自身の質問に答えたようです。オブジェクトは、初期化できないシングルトンであるため、コンストラクター引数を持つことはできません。

オブジェクトをクラスに変換すると、Constraintsオブジェクト (または DI フレームワーク) がオブジェクトを作成するときに依存関係を注入できるようになります。

于 2014-10-14T15:37:01.053 に答える