【问题标题】:Managed controllers in Play 2.3 with DI (Scaladi / Guice)Play 2.3 中带有 DI 的托管控制器(Scaladi / Guice)
【发布时间】:2014-05-23 14:57:58
【问题描述】:

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

我仍在试用 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 下的 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/”下注册。该控制器尚未管理。因此,在我将上述步骤调整到第二个控制器之后,一切正常。

【问题讨论】:

    标签: scala dependency-injection playframework guice scaldi


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      控制器实例(使用@ 表示法在路由中声明)使用Global 中的方法进行初始化:

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

      所以如果你想插入一个 DI 框架,你需要重写这个方法,将一个 Class[A] 变成一个 A 的实例。

      【讨论】:

      • 嘿,感谢您的帮助,不幸的是,这不是问题所在。在 Scaldi 中,似乎没有必要覆盖 getControllerInstance。不过谢谢!不幸的是,我没有足够的代表来支持你的答案。对不起。
      • @Manuel Bernhardt,我有 @ 用于路线,getControllerInstance 在 Global 中被覆盖。 getControllerInstance 方法永远不会被调用。我应该检查什么?谢谢。
      • 全局调用了吗?如果不是,Global 是否扩展 GlobalSettings?
      【解决方案3】:

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

      routesGenerator := InjectedRoutesGenerator
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-13
        • 1970-01-01
        • 2015-11-24
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        相关资源
        最近更新 更多