Play:如何用DI替换“Play.current”?

时间:2017-02-03 10:18:05

标签: scala playframework playframework-2.0

在尝试编写测试时,我从Play中收到此警告:

  

您在范围内没有隐式应用程序。如果您想将当前运行的应用程序置于上下文中,请使用依赖注入。

我发现如果我添加了这个导入,它神奇地解决了范围内应用程序的问题:

import play.api.Play.current

然而它警告你

  

对象Play中的方法当前不推荐使用:这是对应用程序的静态引用,而是使用DI

如何使用依赖注入来获得相同的结果?这就是我需要的地方:

class TestSpec extends PlaySpec with OneAppPerSuite { ... }

修改:我确实找到了this post,但我看不出答案如何能为我提供一个获得隐式 Application的线索

1 个答案:

答案 0 :(得分:0)

我被指向this example(由@ insan-e),它显示了如何解决这个问题。您无法注入测试类,但您“只”需要使用以下内容覆盖gulp.task('defaultTheme', function () { return gulp.src([ './style/colors/*.less', './style/variables.less', './style/general.less' ]) .pipe(foreach(function(stream, file) { return stream .pipe(concat('theme-'+ file.name +'.css')) })) .pipe(less().on('error', function(err) { gutil.log(err); this.emit('end'); })) .pipe(stripCssComments()) .pipe(gulpif(isLive, cleanCSS({compatibility: 'ie9'}))) .pipe(gulp.dest('./style/dist')) });

PlaySpec

和测试:

import javax.inject.{Inject, Singleton}
import org.scalatestplus.play.{OneAppPerSuite, PlaySpec}
import play.api.Application
import play.api.inject.guice.GuiceApplicationBuilder

// To avoid repeating the `instanceCache` line below for each DAO
@Singleton
class DaoContext @Inject()(
                        val testDAO: TestDAO
                        // Other DAOs here
)

abstract class BetterSpec extends PlaySpec with OneAppPerSuite {
  implicit override lazy val app = new GuiceApplicationBuilder().configure(...).build

  protected def daoContext(implicit app: Application): DaoContext = {
    Application.instanceCache[DaoContext].apply(app)
  }
}

我知道,“到底是什么????”但它确实有效。

N.B。现在它可以作为Play Slick: How to inject DbConfigProvider in tests

的副本关闭