1

提前感谢您抽出时间来看看我目前的游戏问题。

我仍在尝试 Playframework,目前是 2.3 版。

目前我试图弄清楚依赖注入。我遵循了激活器中为 guice 和 scaladi 提供的教程,并且总是导致相同的编译器错误:

play.PlayExceptions$CompilationException: Compilation error[object Application is not a member of package controllers Note: class Application exists, but it has no companion object.]

这让我觉得我错过了 Playframework 的一个更通用的部分,因为这个问题与特定的 DI 框架无关。

因此,让我描述一下我对 scaladi 的尝试(任何带有 guice 的工作解决方案也将不胜感激):

在 conf/routes 中定义路由:

GET     /        @controllers.Application.index

(添加了 @ 以支持自 play 2.1 afaik 起支持的托管控制器)

定义控制器:

package controllers

import scaldi.{Injector, Injectable}
import scala._
import play.api._
import play.api.mvc._
import services.GreetingService

class Application(implicit inj: Injector) extends Controller with Injectable {
  val greetService= inject [GreetingService]

  def index = Action {
    Ok("Here I am")
  }
}

在 app\Global.scala 下定义 Global 以修改 GlobalSetting:

import modules.ApplicationModule
import play.api.GlobalSettings
import scaldi.play.ScaldiSupport

object Global extends GlobalSettings with ScaldiSupport {

  def applicationModule = new ApplicationModule
}

最后是 app\modules\ApplicationModule.scala 下的应用模块:

package modules

import controllers.Application
import scaldi.Module

class ApplicationModule extends Module {
  binding to new Application
}

所以我真的很感激任何帮助来弄清楚为什么 Application 类不能位于包控制器中。同样,我会对任何可行的解决方案感到高兴,可能是 guice 或 scaladi。

谢谢!

编辑: 问题是另一个路由的第二个控制器也在“/conf/routes/”下注册。该控制器尚未管理。因此,在我将上面描述的步骤调整到第二个控制器之后,一切正常。

4

3 回答 3

2

所以似乎错误是配置了另一条未管理的路由。这导致了object Application is not a member of package controllers Note: class Application exists, but it has no companion object.错误。

因为我的另一个控制器(用户)确实是一个对象而不是一个类。因此,将 UserController 转移到类和 scaldi 解决了这个问题。控制器的传输与上面描述的应用程序控制器相同。

于 2014-05-26T13:57:29.190 回答
1

控制器实例(使用@符号在路由中声明)使用以下方法初始化Global

def getControllerInstance[A](controllerClass: Class[A]): A

所以如果你想插入一个 DI 框架,你需要重写这个方法,把 aClass[A]变成A.

于 2014-05-26T07:49:04.293 回答
0

就我而言,我通过将以下内容添加到 build.sbt 来解决:

routesGenerator := InjectedRoutesGenerator
于 2016-06-26T11:06:11.123 回答