使用DI(Scaladi/Guice)的游戏2.3中的托管控制器
提前感谢您抽出时间来了解我目前的游戏问题 我仍在尝试Playframework,目前版本为2.3 目前,我试图找出依赖注入。 我遵循了activator for guice和scaladi中提供的教程,始终导致相同的编译器错误:使用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
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方法从未被调用。我应该检查什么?谢谢。有没有打过环球电话?如果没有,全局是否扩展全局设置?