2016-06-13 8 views
0

私は共通のクラスを作成し、モジュールに入れてすべてのプロジェクトで共有することに決めました。ダガーは間違ったクラスを挿入します(子クラスの代わりに親を挿入します)

は例えば、私は私の共有モジュール

// This is a bass class, no application will use it. 
public class GetPlayerInteractor extends ApiInteractor { 

    @Inject 
    public GetPlayerInteractor(ThreadExecutor threadExecutor, 
          PostExecutionThread postExecutionThread, 
          RestClient restClient, 
          RequestTokenInteractor requestTokenInteractor) { 
    super(threadExecutor, postExecutionThread, restClient, requestTokenInteractor); 
    } 
} 

// This class will accept GetPlayerInteractor or its children class as argument. 
public class PlayerAuthenticationInteractor extends ApiInteractor { 

    @Inject 
    public PlayerAuthenticationInteractor(ThreadExecutor threadExecutor, 
             PostExecutionThread postExecutionThread, 
             RestClient restClient, 
             RequestTokenInteractor requestTokenInteractor, 
             GetPlayerInteractor getPlayerInteractor) { 
    super(threadExecutor, postExecutionThread, restClient, requestTokenInteractor, 
     getPlayerInteractor); 
    } 
} 

にし、モジュールを含むアプリケーションで次のようなクラスを持っている

// This one is the actual class I need to inject 
public class GetPlayerByEmailInteractor extends GetPlayerInteractor { 

    private GetDomainNameInteractor getDomainNameInteractor; 

    @Inject 
    public GetPlayerByEmailInteractor(ThreadExecutor threadExecutor, 
            PostExecutionThread postExecutionThread, 
            RestClient restClient, 
            RequestTokenInteractor requestTokenInteractor, 
            GetDomainNameInteractor getDomainNameInteractor) { 
    super(threadExecutor, postExecutionThread, restClient, requestTokenInteractor, getPlayerCustomFieldsInteractor); 

    this.getDomainNameInteractor = getDomainNameInteractor; 
    } 
} 

そして、これは、アプリケーション

@Module 
public class UserModule { 

    @Provides 
    @PerActivity 
    GetPlayerInteractor provideGetPlayerInteractor(ThreadExecutor threadExecutor, 
               PostExecutionThread postExecutionThread, 
               RestClient restClient, 
               RequestTokenInteractor requestTokenInteractor, 
               GetDomainNameInteractor getDomainNameInteractor) { 
    Log.i("Dev", "Create GetPlayerInteractor"); 
    return new GetPlayerByEmailInteractor(threadExecutor, postExecutionThread, restClient, requestTokenInteractor, getDomainNameInteractor); 
    } 

    @Provides 
    @PerActivity 
    PlayerAuthenticationInteractor providePlayerAuthenticationInteractor(ThreadExecutor threadExecutor, 
                     PostExecutionThread postExecutionThread, 
                     RestClient restClient, 
                     RequestTokenInteractor requestTokenInteractor, 
                     GetPlayerByEmailInteractor getPlayerByEmailInteractor) { 
    Log.i("Dev", "Create PlayerAuthenticationInteractor"); 
    return new PlayerAuthenticationInteractor(threadExecutor, postExecutionThread, restClient, requestTokenInteractor, getPlayerByEmailInteractor); 
    } 
} 
でUserModuleです

GetPlayerInteractorのための@Provideは、決して基本クラスbuであるため書かない何らかの理由でGetPlayerByEmailInteractorが作成されていない場合は、Provideメソッドは決して印刷されません(私が決して設定しないブレークポイントも).getPlayerByEmailInteractorではなくPlayerAuthenの引数としてgetPlayerInteractorを取得します。また

、私はまだビルド成功を

@Provide 
@PerActivity 
GetPlayerInteractor provideGetPlayerInteractor(...) 

@Provide 
@PerActivity 
PlayerAuthenticationInteractor providePlayerAuthenticationInteractor(...) 

の両方を削除して、アプリが

私はDaggerApplicationComponentを見てみると、私は次のように参照を実行できるかどうか

public final class DaggerApplicationComponent implements ApplicationComponent { 
    // Some other classes 
    private Provider<GetPlayerInteractor> getPlayerInteractorProvider; 
    private Provider<PlayerAuthenticationInteractor> playerAuthenticationInteractorProvider; 
    // Some other classes 
    private Provider<GetPlayerByEmailInteractor> getPlayerByEmailInteractorProvider; 
    // Some other classes 

    private void initialize(final Builder builder) { 
    // Some other classes 
    this.getPlayerInteractorProvider = ... 
    this.playerAuthenticationInteractorProvider = PlayerAuthenticationInteractor_Factory.create((MembersInjector) MembersInjectors.noOp(), provideThreadExecutorProvider, providePostExecutionThreadProvider, provideRestClientProvider, provideRequestTokenInteractorProvider, getPlayerInteractorProvider); 
    // Some other classes 
    this.getPlayerByEmailInteractorProvider = ... 

    } 
} 

PlayerAuthenticationInteractor_Factoryに渡すlassパラメータは、getPlayerByEmailInteractorProviderではなく、getPlayerInteractorProviderであることに注意してください。

私は間違っています。

答えて

1

あなたには、GetUserUseCaseがほしいと告げるでしょう。

@Inject 
public GetEmployeeUseCase() 

@Inject 
public GetEmployeeUseCase() 

あなたGetUserUseCaseとその子の両方がコンストラクタ・インジェクションを介して提供することができますが、あなたはGetUserUseCaseを要求したので、これはあなたが得るものです。

GetUserUseCaseを使用しない場合は、リクエストしないでください。簡単な方法は、あなたがこれにメソッドを提供し修正するために、次のようになります種類の大丈夫、のロジック以来、あなたはまだ提供するものである

UserPresenter provideUserPresenter(GetEmployeeUseCase getUserUseCase) 

は、ビジネスロジックでモジュール内にあり、ありません。あなたは/あなたのスーパークラスを提供する必要がある場合は、それから@Providesを削除し、使用するサブクラスについて短剣を伝えるために、次のような方法を提供します

@Provides GetUserUseCase provideUserUseCase(GetEmployeeUseCase getUserUseCase) { 
    return getUserUseCase; 
} 

これは自分のサブクラスの実装をマッピングします親クラスに追加します。親の@Inject注釈を削除しないと、の複数の方法が使用されます...エラー。

+0

こんにちはデビッド、あなたの答えをありがとうございますが、残念ながらそのメソッドがUserPresenterを提供するために働いていないので、私はすでにGetEmployeeUseCaseクラスをリクエストしています。実際のクラスでコードを更新して、私が逃したものを見る方が良いかもしれない。 –

+0

質問が更新されました。最初は実際のクラスを提供していません。 –

+0

@ Tar_Tw45クラスコンストラクタの '@ Inject'アノテーションを削除してみてください。あなたの提供するメソッドは無視されます –

関連する問題