私は本当に好きDevabc's solutionインジェクタ自体を取得するためにコンストラクタインジェクションに依存できないシナリオがいくつかあるため、Play 2.5.xでは、非推奨のplay.api.Play.current.Injector
コードを使用してインジェクタを取得する必要があります。
彼のソリューションは、Play組み込みインジェクタへの参照を作成し、それを必要なときに任意のコンポーネントによってインポートできるScalaオブジェクトに配置します。ブリリアント!
しかし、オブジェクトをインジェクタを取得するためのパブリックインターフェイスを提供する必要がありますので、修正するコードを修正し、使用方法をデモします。
import play.api.inject.Injector
import javax.inject.Inject
@Singleton
class GlobalContext @Inject()(playInjector: Injector) {
GlobalContext.injectorRef = playInjector
}
object GlobalContext {
private var injectorRef: Injector = _
def injector: Injector = injectorRef
}
初期化部分は同じです。
// InjectionModule.scala
package modules
class InjectionModule extends AbstractModule {
override def configure() = {
// ...
// Eager initialize Context singleton
bind(classOf[GlobalContext]).asEagerSingleton()
}
}
// application.conf
play.modules.enabled += "modules.InjectionModule"
クライアントコードは非常に簡単です。インジェクタを必要とするコンポーネントであれば、
// Import the object GlobalContext
import GlobalContext.injector
// ...
val yourClassInstance = injector.instanceOf[YourClass]
もっと詳しく教えてください。なぜインジェクタにアクセスする必要がありますか? – marcospereira
@marcospereira私はGuice FactoryModuleBuilderを使用して、実行時に別のファクトリを返すファクトリを実装しました!返す工場の第2レベルでは、私はPlay guice Injectorにアクセスして、Injectアノテーションの代わりにリフレクションを使ってオブジェクトを手動で取得する必要があります。 –
'Play.current'はある時点で削除されるため、使用しないでください。注射器を注射できるのでしょうか? – marcospereira