2016-09-07 14 views
0

私はDIを使って解決するのは非常に簡単なシナリオですが、適切なサンプル/ドキュメントを見つけることができません。私はScala/Guiceの世界では初めてです。Scala Guiceの依存関係注入 - パラメータの受け渡し

電流成分は、私はfooとbarの間の依存関係を持って、今、この

trait Foo { 
} 

class FooImpl extends A { 

} 

trait Bar { 
    val description: String 
} 

class BarImpl(val description: String) extends Bar { 

} 

のように見えます。 ので、通常のコードはcreateBar("Bar!")は、単にnew BarImpl("Random Bar Value")を返します。この

class FooImpl extends Foo { 
    Bar bar = createBar("Random Bar Value!") 
} 

ようになります。もちろん、簡潔にするために工場/ヘルパーを削除しています。

私が "新しい"を使用する瞬間、これはDIのパラダイムから外れていることを認識しています。私はBarがFooImplにパラメータに基づいて注入できるようにしたい。ファクトリーを使うのが好きです。 Scala/Guiceの世界ではどのようにDIを使用しますか?

私はAssistedInjection/Named Parametersを見ましたが、使用状況がどのようになっているのか理解できませんでした。私はそれが最善の方法だと考えていますが、どのように書かれ、テストされるべきか理解できませんでした。

答えて

0

これは私にとってはうまくいきました。 Scalaベースのアシスト注入に対処したい人は、これらの手順を書き直してください。

FooにはBarが必要な場合がありますが、実際に注入する必要があるのはBarではなくBarFactoryです。

BarFactoryを作成する必要がありますが、実装はGuiceに委ねられます。これは難しいところです。

trait BarFactory { 
    def create(msg:String):Bar 
} 

それでは、fooとbarを再検討してみましょう:

@ImplementedBy(classOf[FooImpl]) 
trait Foo { 
    def getBar(msg: String): Bar 
} 

class FooImpl @Inject() (barFactory: BarFactory) extends Foo { 
    override def getBar(msg: String): Bar = { 
    barFactory.create(msg) 
    } 
} 

@ImplementedBy(classOf[BarImpl]) 
trait Bar { 
    def echo() : String 
} 

//Note that we use the @Assisted Annotation Here. 
class BarImpl @Inject() (@Assisted msg: String) extends Bar { 
    override def echo(): String = msg 
} 

実際の工場が

class TempModule extends AbstractModule { 
    override def configure(): Unit = { 
    install(new FactoryModuleBuilder() 
     .implement(classOf[Bar], classOf[BarImpl]) 
     .build(classOf[BarFactory])) 
    } 
} 

そして、一旦開始モジュールの一部として行われているの作成、ファクトリ実装はによって提供されますGuice、あなたはFactoryを使って実際の実装を作成できるはずです。

関連する問題