2016-04-27 7 views
0

次のようにクラスBを想像してみて:使用Guiceの注釈(スカラ)

class B @Inject() (wsClient: WSClient) { 
    ... 
} 

はその後、別のクラスAに、私はBのインスタンスを作成する必要があります。

class A { 
    val b = new B() 
} 

それはつもりそのI言って文句を言われます私のコンストラクタでwsClientを指定していません。この問題を解決するため 一つの方法は、変更することです:

class A @Inject() (wsClient: WSClient) { 
    val b = new B(wsClient) 
} 

は、私も私のクラスBに暗黙的に追加することもできますが、両方の場合には、それだけでこのように依存関係を送信するために私には非常に間違っているようです...

私はもっとエレガントな方法でこれを行うことができますか?

答えて

1

BAに注射してみませんか?

class A @Inject() (b: B) 

シングルトンにする必要があるBあなたのクラスは、ちょうどjavax.inject.Singletonでそれに注釈を付ける場合。

+0

私は、1つの問題を解決します。 しかし、同じ問題が継承で起こります。もしAがBを伸ばすなら、私はAに注入しなければならず、Bの中に注入されたすべてのdepsを渡すでしょうか? – Scipion

2

DIの全体のポイントはinversion of controlです。アプリケーションのクラスが独自のコントロールフローを担当するのではなく、バインドによってアプリケーションの構築方法が決まります。

val b = new B(wsClient)という行は、DIフレームワークが責任を負うのではなく、クラス自体がどのように構成されるべきかを知っているため、この原則に違反しています。

@zoltanが指摘したように、AをBに注入すると、問題を解決する正しい方法になります。

+0

いくつかのことをすることで、クラスAのwsにどうやってアクセスできますか? b.wsは機能しません。つまり、クラスBの中にバインドする必要がありますか? – Scipion

+1

もしAがwsを必要とするなら、Aに入力してください – nattyddubbs

+0

次にAにBを注入しているにも関わらず、@Inject()(WS:WSClient)をAとBの両方に複製しなければなりませんか? – Scipion

関連する問題