2015-10-04 91 views
1

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

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

我可以将它作为参数传递给模板,但我必须在每个页面上执行此操作(因为它应显示在菜单栏中)。我正在寻找另一个解决方案,我不必将它传递到任何地方。目前,我在模板中创建一个新的对象,每当它被呈现时(这会让我得到一个更干净的代码,但性能更差)。

+0

我不认为有一个简单的方法来实现你想要的,但我认为答案[这里](http://stackoverflow.com/questions/9629250/how-to-avoid-passing-parameters-无处不在2)可以提供帮助。 –

+0

您是否可以在单独的模板中抽象菜单栏以避免在每个模板中传递参数? – Adi

+0

@BhashitParikh:感谢您的链接,它确实是一个可行的选择。但是,仍然不是我想要的。 – Itchy

回答

3

你可以在没有太多努力的情况下分类假。

首先,创建一个提供对DAO的访问的Scala对象(它可以包含尽可能多的东西,只需在顶层对象和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的项目。

您可以在实践中这里看到:

在一个侧面说明,我会考虑,如果你真的想在你的模板层,以做数据访问。

+0

谢谢,您为我节省了大量时间,无需将对象传递给100多个模板。 – dingdong

+1

在你的模板中,你还需要'@import play.api.Play.current'来完成这个工作。 – Itchy

+0

@Itchy编辑,谢谢。 –

相关问题