2016-12-05 12 views
1

自己完結し、スタンドアロンモジュールとして使用できる2つのモジュールModuleAModuleBがあるとします。類似の依存関係を持つ2つの異なるモジュールを持つguiceインジェクタを作成する

Guice.createInjector(new ModuleA(), new ModuleB()); 
:どちらのモジュールは、私は私がこれをした両方のモジュール、AとBとのインジェクターを作成する必要があるユースケースを持って、今

install(new ModuleC()); 

のような第3のモジュールModuleCへの依存性を持っています

それは予想通りにCreationExceptionを投げました。これは、特定のクラスへのバインディングがすでにモジュールの1つで構成されていると言いました。 ModuleAModuleBを変更する権限がないことを念頭に置いて、どのように動作させるのですか?

Modules.combine(Modules... modules)を使ってみましたが、それでも問題は解決しませんでした。これには何か解決策がありますか?

ModuleC

答えて

4

を使用すると、定義された以下のバインディングを持って考えてみましょう

  • C1

ModuleA

  • A1
  • A2

ModuleB

  • B1
  • B2

今、あなたはGuice.createInjector(new ModuleA(),new ModuleB())Modules.combine(..)を行う際に、 バインディングのあなたの最終的なリストは次のようになります。

  • A1
  • A2
  • B1
  • B2
  • C1(Aから継承される)
  • C1(!)(Bから継承される)

C1結合の通りであります2回リストされると、競合が発生し、CreationExceptionが発生します。

しかし、あなたの代わりにModules.override()を使用する場合:

が与えられたモジュールの上に上書きモジュールをオーバーレイモジュールを作成するビルダーを返します。キーが両方のモジュールセットにバインドされている場合、オーバーライドモジュールからのバインディングのみが保持されます。

などの、

  • A1を
  • A2
  • B1(Aから継承される)
  • B2
  • C1を次のようにバインディングの

    Modules.override(new ModuleA()).with(new ModuleB() 
    

    あなたの最終的なリストの操作を実行してになります

  • C1(Bから継承)

C1がModuleAから継承された結合は、このように競合を解決する、ModuleBで定義されるように結合C1を支持して削除されます。

+0

はい、私はそれを試みました。動作しません。 – rockydgeekgod

+0

私は試しました 'Guice.createInjector(Modules.override(new ModuleA()、new ModuleB())。(new ModuleC())); ' – rockydgeekgod

+0

これはうまくいきました。 'Guice.createInjector(Modules.override(new ModuleA())。with(new ModuleB())'。ありがとうございます。 – rockydgeekgod

関連する問題