2017-04-01 9 views
0

私はお互いに依存するいくつかのクラス、GamePresenterGameManagerを持っています。 私はコンストラクタインジェクションを使ってそれらを注入しようとしていますが、依存サイクルエラーが見つかったので、それを動作させる方法をまだ理解できません。ダガー2つのモジュールはお互いに依存します

GameFragmentフラグメントにGamePresenterを注入する必要があり、そうGameManagerGamePresenterに注入されるであろうしながら最初は、第二に話すことになります。

GamePresenterである:

@Inject 
GamePresenter(GameRepository gameRepository, GameManager gameManager, GameContract.View view) { 
    DaggerGameManagerComponent.builder() 
      .gameManagerModule(new GameManagerModule(this)) 
      .build() 
      .inject(this); 

    this.view = view; 
    this.gameRepository = gameRepository; 
    this.gameManager = gameManager; 
} 
GamePresenterModule

である:

@Module 
public class GamePresenterModule { 
    private final GameContract.View view; 

    public GamePresenterModule(GameContract.View view) { 
     this.view = view; 
    } 

    @Provides 
    GameContract.View provideGameContractView() { 
     return view; 
    } 
} 

GamePresenterComponentである:

@FragmentScoped 
@Component(dependencies = RepositoryComponent.class, modules = GamePresenterModule.class) 
public interface GamePresenterComponent { 
    void inject(GameFragment gameFragment); 
} 

GameManagerである:

@Inject 
public GameManager(GamePresenter gamePresenter, Game game) { 
    this.gamePresenter = gamePresenter; 
    this.game = game; 
} 

GameManagerModuleは次のとおりです。

@Module 
public class GameManagerModule { 
    private GamePresenter presenter; 

    public GameManagerModule(GamePresenter presenter) { 
     this.presenter = presenter; 
    } 

    @Provides 
    GameManager provideGameManager(Game game) { 
     return new GameManager(this.presenter, game); 
    } 

    @Provides 
    Game provideGame() { 
     return new Game(); 
    } 
} 

GameManagerComponentは次のとおりです。

@FragmentScoped 
@Component(dependencies = GamePresenterComponent.class, modules = GameManagerModule.class) 
public interface GameManagerComponent { 
    void inject(GamePresenter gamePresenter); 
} 

そして最後に、GameFragmentは次のとおりです。

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 

    DaggerGamePresenterComponent.builder() 
      .repositoryComponent(((GameApplication) getActivity().getApplication()).getRepositoryComponent()) 
      .gamePresenterModule(new GamePresenterModule(this)) 
      .build() 
      .inject(this); 
} 

事前にどうもありがとう!

答えて

0

この種の問題が発生した場合は、アーキテクチャーを垣間見るべきです。

この場合、GamePresenterGameManagerを注入しないことをおすすめします。代わりにGameManagerから必要なメソッドを持つインターフェイスを定義し、GameManagerに実装して、コンストラクタまたはプロバイダ内に登録します。

+0

どうすればいいですか?特に "コンストラクタまたはプロバイダの内部に登録する" – noloman

関連する問題