У меня есть простая тестовая установка Dagger 2, основанная на http://konmik.github.io/snorkeling-with-dagger-2.html. Он внедряет 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 неправильно внедряет?