2016-07-27 7 views
1

私は、Play 2.4.xでPlay.current.configuration.getString('NAME_HERE')で変数application.confを取得していましたが、クラス、オブジェクト、コンパニオンオブジェクトでもうまくいきました。ScalaとPlay 2.5.xを使用してオブジェクトのapplication.conf変数を取得する方法は?

さて、私は新しいプロジェクトにScalaのでプレ​​イ2.5.4を使用していて、このように、それは非推奨だので、私は、このPlay.currentを使用しませんが、DIを使用して代替がある:

class HomeController @Inject() (configuration: play.api.Configuration) extends Controller { 
    def config = Action { 
    Ok(configuration.underlying.getString("db.driver")) 
    } 
} 

このDI注入は、クラスの魅力のように機能しますが、このプロジェクトでは、変数db.driverをオブジェクトに入れる必要がありますか?そして、私が知る限り、物体を使って私はDIを使うことはできません。

多分Guiceを使用すると役に立ちますか?あなたは

Play.current.configuration 

を行うことができます

答えて

0

しかし、それは(おそらく)はもはやプレイ2.6で可能になることはありません。

しかし、理想的には、オブジェクトのメソッドにパラメータとして渡すか、オブジェクトではなくクラスを使用します。私はsomtimes「オブジェクトからクラスへの」移行する何

:あなたの方法のすべてのユーザーがゆっくりとクラスを使用して移行することができますが

class MyComponent @Inject() (config: Configuration) { 
    // here goes everything nice 
    def doStuff = ??? 
} 

object MyComponent { 
    @deprecated("Inject MyComponent") 
    def doStuff = { 
    val instance = Play.current.injector.instanceOf[MyComponent] 
    instance.doStuff 
    } 
} 

この方法では、既存のコードを壊すていません。

+0

が今@deprecated二つの引数:) を取り、私はバージョンを追加した場合でも、これを使用して動作しません:) – elarib

+0

@elarib理由は? – rethab

1

あなたが代わりにobject

trait Foo {} 

@Singleton 
class FooImpl @Inject()(configuration: play.api.Configuration)) extends Foo { 
    //do whatever you want 
} 

@Singleton@Singleton注釈付きクラスを使用することができますがスカラ座自体がネイティブにシングルトンを作成するための構文objectを持っているので、クラスsingleton.Itは少しぎこちない感じになり、しかし、これは最も簡単でおそらく最高ですDIへのソリューションをシングルトンに変換する

以下のコードのように熱心にシングルトンを作成することもできます。

bind(classOf[Foo]).to(classOf[FooImpl])asEagerSingleton()

詳細情報のために、あなたはGoogle Guice Wikiを検索することができますし、それを呼び出す方法Playframework site

EDIT

は正確Playframework2.5でどのようにDIと同じです。

class BarController @Inject()(foo: Foo) extends Controller { 
    //Do whatever you want with Foo 
} 

Guiceのは、基本的に新しいインスタンスを生成しますDIたびに、あなたが@Singletonを入れたら、Guiceのではなく、インスタンスを1つだけ使用します。

DIはアンチハイカップリング用です。別のクラスから定義したクラスを使用する場合は、DIを作成する必要があります。そうしないと、クラスが強く結合され、単体テストのコード作成が難しくなります。

参考までに、このテクニックを使用してPlay外で使用できます。

Create an Instance of class which does DI via Playframework Guice Independently in Scala

+0

どうすればこのシングルトンを呼び出すことができますか? – elarib

+0

@elaribが答えを更新しました。 – suish

関連する問題