簡體   English   中英

在playframework中設置像這樣的GLOBAL變量是一種好習慣嗎?

[英]Is it a good practice to set GLOBAL variables like this in playframework?

我在我的同事寫的app/Global.scala看到了這樣的代碼

import java.lang.reflect.Constructor
import securesocial.core.RuntimeEnvironment
import securesocial.core.providers._
import securesocial.core.providers.utils.Mailer
import services.UserService

import scala.collection.immutable.ListMap

object Global extends play.api.GlobalSettings {

  /**
   * The runtime environment for this app.
   */
  object MyRuntimeEnvironment extends RuntimeEnvironment.Default[User] {
    // override lazy val routes = new CustomRoutesService()
    override lazy val userService: UserService = new UserService()
    lazy val MailTemplates: MailTemplates = new MailTemplates(this)
    override lazy val mailer: Mailer = new Mailer(MailTemplates)
    // override lazy val eventListeners = List(new MyEventListener())
    override lazy val providers = ListMap(
      // oauth 2 client providers
      include(new FacebookProvider(routes, cacheService, oauth2ClientFor(FacebookProvider.Facebook))),
      // username password
      include(new UsernamePasswordProvider(userService, avatarService, passwordHashers))
    )
  }

  /**
   * An implementation that checks if the controller expects a RuntimeEnvironment and
   * passes the instance to it if required.
   *
   * This can be replaced by any DI framework to inject it differently.
   *
   * @param controllerClass
   * @tparam A
   * @return
   */
  override def getControllerInstance[A](controllerClass: Class[A]): A = {
    val instance = controllerClass.getConstructors.find { c =>
      val params = c.getParameterTypes
      params.length == 1 && params(0) == classOf[RuntimeEnvironment[User]]
    }.map {
      _.asInstanceOf[Constructor[A]].newInstance(MyRuntimeEnvironment)
    }
    instance.getOrElse(super.getControllerInstance(controllerClass))
  }
}

有人認為在Playframework中將服務設置為全局值是否合適?

服務通常實現為無狀態單例,因此我可以說是可以的。 您的問題與一般依賴性注入原則有關,而不是與Play有關。

是。 這是在沒有使用依賴項注入框架的情況下進行播放的標准依賴項注入模式。 它允許您執行與Spring請求范圍類似的請求范圍變量。

您的實現看起來像是基於正在發揮作用的SecureSocial示例實現。 參見https://github.com/jaliss/securesocial/blob/master/samples/scala/demo/app/Global.scala

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM