1

時間を割いて、私の現在のプレイの問題を見ていただきありがとうございます。

現在バージョン 2.3 の Playframework をまだ試しています。

現時点では、依存性注入を理解しようとしています。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.]

これは、問題が特定の DI フレームワークに関連付けられていないため、Playframework のより普遍的な部分が欠けていると思います。

それで、私がscaladiで試したことを説明しましょう(guiceを使用した実用的なソリューションも高く評価されます):

conf/routes でルートを定義します。

GET     /        @controllers.Application.index

(Play 2.1 以降でサポートされている管理対象コントローラーのサポートのために @ を追加しました)

コントローラーの定義:

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 /」の下にも登録された別のルートの2番目のコントローラーでした。このコントローラーはまだ管理されていません。したがって、上記の手順を2番目のコントローラーに適用した後、すべて正常に機能しました.

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 に転送すると、この問題が修正されました。コントローラーの転送は、前述の Applicationcontroller i と同じでした。

于 2014-05-26T13:57:29.190 に答える
1

@コントローラ インスタンス (表記法を使用してルーティングで宣言) は、次のメソッドを使用して初期化されGlobalます。

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

したがって、DI フレームワークをプラグインする場合は、このメソッドをオーバーライドして、Class[A]を のインスタンスに変換する必要がありますA

于 2014-05-26T07:49:04.293 に答える