使用DI(Scaladi/Guice)的游戏2.3中的托管控制器

使用DI(Scaladi/Guice)的游戏2.3中的托管控制器,scala,dependency-injection,playframework,guice,scaldi,Scala,Dependency Injection,Playframework,Guice,Scaldi,提前感谢您抽出时间来了解我目前的游戏问题 我仍在尝试Playframework,目前版本为2.3 目前,我试图找出依赖注入。 我遵循了activator for guice和scaladi中提供的教程,始终导致相同的编译器错误: play.PlayExceptions$CompilationException: Compilation error[object Application is not a member of package controllers Note: class Appli

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

我仍在尝试Playframework,目前版本为2.3

目前,我试图找出依赖注入。 我遵循了activator for 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
(添加@以支持自播放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下定义用于修改全局设置的全局设置:

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
}
所以,我真的很想得到任何帮助,找出为什么应用程序类不能位于包控制器中。 同样,我也会很高兴任何可行的解决方案,可能是guice或scaladi

谢谢大家!

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

控制器实例(使用
@
符号在路由中声明)使用
全局
中的方法初始化:

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

因此,如果您想插入DI框架,您需要重写此方法,将
类[a]
转换为
a

的实例,因此错误似乎是配置了另一个未管理的路由。 这导致
对象应用程序不是包控制器的成员注意:类应用程序存在,但它没有伴生对象。
错误

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

在我的例子中,我通过在build.sbt中添加以下内容来解决:

routesGenerator := InjectedRoutesGenerator

嘿,谢谢你的帮助不幸的是,这不是问题所在。在Sparthi中,似乎没有必要超越getControllerInstance。但是谢谢你!不幸的是,我没有足够的代表投票支持你的答案。对不起。@Manuel Bernhardt,我在全局中覆盖了@for路由和
getControllerInstance
<代码>getControllerInstance方法从未被调用。我应该检查什么?谢谢。有没有打过环球电话?如果没有,全局是否扩展全局设置?