http://konmik.github.io/snorkeling-with-dagger-2.htmlに基づいて、単純な Dagger 2 テストセットアップを用意しました。すべての設定を出力する PreferenceLogger を挿入します。注入されたクラスでは、さらにクラスを @Inject できます。
public class MainActivity extends Activity {
@Inject PreferencesLogger logger;
@Inject MainPresenter presenter;
@Override protected void onCreate(Bundle savedInstanceState) {
MyApplication.getComponent().inject(this);
presenter.doStuff();
logger.log(this);
}
}
public class PreferencesLogger {
@Inject OkHttpClient client;
@Inject public PreferencesLogger() {}
public void log(Contect context) {
// this.client is available
}
}
これを実行すると、ロガーが設定され、PreferencesLogger.log 内で OkHttpClient が正しく設定されます。したがって、この例は期待どおりに機能します。今、私はMVP構造を整えようとしています。実装のある MainPresenter インターフェイスがあります。MainActivity で次を設定します。
@Inject MainPresenter presenter;
そのため、この MainPresenter を別の (デバッグまたはテスト) 実装に切り替えることができました。もちろん、使用する実装を指定するモジュールが必要です。
public interface MainPresenter {
void doStuff();
}
public class MainPresenterImpl implements MainPresenter {
@Inject OkHttpClient client;
public MainPresenterImpl() {}
@Override public void doStuff() {
// this.client is not available
}
}
@Module public class MainActivityModule {
@Provides MainPresenter provideMainPresenter() {
return new MainPresenterImpl();
}
}
OkHttpClient が注入されなくなったという問題が発生しました。もちろん、パラメーター OkHttpClient を受け入れるようにモジュールを変更することもできますが、これが推奨される方法ではないと思います。MainPresenterImpl が正しく注入されない理由はありますか?