【问题标题】:Play Framework 2.4 use injected variable in Scala templatePlay Framework 2.4 在 Scala 模板中使用注入变量
【发布时间】:2015-10-04 14:44:24
【问题描述】:

我想在我的网页菜单栏中显示一些数据库中的数据。为了获取数据,我有一个通常使用 Guice 注入创建的数据访问对象 (DAO)。

如何在我的 Scala 模板中使用这样的(注入的)对象?

我可以将它作为参数传递给模板,但我必须在每一页上都这样做(因为它应该显示在菜单栏中)。我正在寻找另一种解决方案,我不必到处传递它。目前我正在模板内创建一个新对象,每当它被渲染时(这让我的代码更简洁但性能更差)。

【问题讨论】:

  • 我认为没有一种直接的方法可以实现您想要的,但我认为here 的答案可以提供帮助。
  • 能否在单独的模板中抽象菜单栏以避免在每个模板中传递参数?
  • @BhashitParikh:感谢您的链接,这确实是一个可行的选择。然而,仍然不是我想要的。
  • @Adi:我的菜单栏模板已经在一个单独的模板中。但是我是从所有其他模板中调用它的,因此必须通过它们提供参数。

标签: scala playframework playframework-2.4


【解决方案1】:

你可以毫不费力地伪造这个。

首先,创建一个 Scala 对象来提供对 DAO 的访问(它可以包含任意数量的东西,只需在顶级对象和 Implicits 对象中重复该模式)。

package com.example.stuff

object ViewAccessPoint {
  private[stuff] val myDaoCache = Application.instanceCache[MyDao]

  object Implicits {
    implicit def myDao(implicit application: Application): MyDao = myDaoCache(application)
  }
}

在您看来,然后您可以将 Implicits 对象导入您的模板并获取 Guice 创建的 DAO。

@import com.example.stuff.ViewAccessPoint.Implicits._
@import play.api.Play.current

myDao.whatever()

这适用于 Java 和 Scala 项目。

你可以在这里看到这个实践:

附带说明,我会考虑您是否真的想在模板层中进行数据访问。

【讨论】:

  • 谢谢,您节省了我很多时间,无需将对象传递给超过 100 个模板。
  • 在您的模板中,您还需要@import play.api.Play.current 才能完成这项工作。
  • @Itchy 我正在尝试做同样的事情,但我收到了一个编译器警告,指出不推荐使用@import play.api.Play.current。你知道如何用 DI 做到这一点吗?我正在使用 Play 2.5 顺便说一句
  • @RyanStull 它已被弃用,但您仍然需要这样做。我认为模板的 DI 将从 2.6 开始支持。或者,您可以使用 twirl 1.2 - 有关详细信息,请参阅 this thread
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多