2016-09-19 8 views
0

私はScala + Playを使用しています.Giiceは依存性注入用に設定しました。私はまた、舞台裏でAkka Persistenceを使用しており、アプリケーションの周りに注入できるカスタムの読書ジャーナルのバインディングを作成したいと考えています。依存型Guice(Play/Scala)バインディングの作成方法は?

は残念ながら、(私がコントロールしていない)は、リードジャーナルコンストラクタは、俳優のシステムへの明示的な参照が必要です。

PersistenceQuery(actorSystem).readJournalFor[CustomReadJournal]("custom-key") 

は、どのように私は(バインディング定義クラス内から基礎となるactorSystemへの参照を取得しますModule)?これは可能ですか?助けを事前に

bind(classOf[CustomReadJournal]).toInstance(PersistenceQuery(<what do i put here?>).readJournalFor[CustomReadJournal]("custom-journal")) 

ありがとう:より一般的には、それが可能である相互依存的バインディング(?ラScaldi)

を定義するために私のModuleクラスのエントリは、現在のように見えます!

+0

あなたは@Providesを使用して、actorSystemをパラメータとして提供しています。別のものを提供する必要がある場合は、play.api.libs.concurrent.Akka.system(Play.current)を使用して作成されたakkaシステムを使用できます。 – EdgeCaseBerg

答えて

1

依存性注入を作成するために何らかのロジックを行う必要がある場合は、@Provides注釈を使用すると便利です。たとえば:

trait MyProvider { 
    @Provides 
    def provideThing(): Thing = { 
    //make the thing and return it 
    } 
} 
class MyModule extends AbstractModule with MyProvider { 
    override def configure() { 
    bind(classOf[TraitYYY]).to(classOf[ClassThatTakesThingAsParameter]) 
    } 
} 

知っておくと便利なことは、@Provides方法自体はパラメータを取り、その引数を注入し得ることができるということです。たとえば:あなたはにしたいので、私は信じて自分の状況に関連する

@Provides 
def provideThingNeedingParameter(param: P): ThingNeedingParam = { 
    new ThingNeedingParam(param) 
} 

は、いくつかのクラスのインスタンスにアクター・システムを提供します。あなたは完全のconfigureからbindコールを回避し、パラメータもう少しを制御することができ、あなたのCustomReadJournalため@Providesアノテーション付きメソッドを作成することにより

// You can use @Singleton with @Provides if you need this to be one as well! 
@Provides 
def provideActorSystem(app: Application): ActorSystem = { 
    play.api.libs.concurrent.Akka.system(app) 
} 

@Provides 
def providePersistenceQuery(actorSystem: ActorSystem): PersistenceQuery = { 
    PersistenceQuery(actorSystem) 
} 

@Provides 
def provideCustomReadJournal(persistenceQuery: PersistenceQuery):CustomReadJournal = { 
    persistenceQuery.readJournalFor[CustomReadJournal]("custom-key")  
} 

。また、必要なら@Providesは@Singletonと連動します。私はAkkaの永続性を使用していませんが、これはあなたを助けるはずです

関連する問題