Използвам Dagger за инжектиране на зависимости в приложение за Android и се натъкнах на проблем, който съм не съм напълно сигурен как да разреша по чист начин.
Това, което се опитвам да постигна, е да създам помощници и да ги инжектирам в моята дейност, като тези помощници също съдържат инжектирани членове.
Какво работи
Дейността, при която моят помощник се инжектира:
public class MyActivity extends Activity {
@Inject SampleHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MyApplication) getApplication()).inject(this);
Log.i("debug", "helper = " + helper);
Log.i("debug", "helper context = " + helper.context);
}
}
Приложението, създаващо обектната графика:
public class MyApplication extends Application {
private ObjectGraph graph;
@Override
public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(getModules());
}
private Object[] getModules() {
return new Object[] { new MyModule(this) };
}
public void inject(Object target) {
graph.inject(target);
}
}
Инжектирането работи перфектно, когато инстанцирам директно клас SampleHelper, който от своя страна получава инжектиран контекст на приложение:
@Singleton
public class SampleHelper {
@Inject public Context context;
@Inject
public SampleHelper() {}
}
Със следния модул:
@Module(
injects = { MyActivity.class },
complete = false,
library = true
)
public class MyModule {
private final MyApplication application;
public MyModule(MyApplication application) {
this.application = application;
}
@Provides @Singleton Context provideApplicationContext() {
return application;
}
}
Какво не работи
Въпреки това, когато отделя помощния интерфейс от неговата реализация:
public interface SampleHelper {
}
@Singleton
public class SampleHelperImpl implements SampleHelper {
@Inject public Context context;
@Inject
public SampleHelperImpl() {}
}
И добавете това към модула кама:
public class MyModule {
...
// added this method
@Provides @Singleton public SampleHelper provideSampleHelper() {
return new SampleHelperImpl();
}
...
}
Контекстът не се инжектира в моя SampleHelperImpl, както бих очаквал. Предполагам, че това се дължи на това, че SampleHelperImpl се инстанцира чрез директно извикване на конструктор, а не чрез извикване на иницииран от инжектиране конструктор, защото MyModule#provideApplicationContext() дори не се извиква, така че предполагам, че пропускам нещо за Dagger (което е вероятно, тъй като моите предишни DI преживявания включват само пролет).
Някаква идея за това как да инжектирам моя контекст в моята инжектирана помощна реализация по начин "чист кама"?
Благодаря много!
SampleHelper
, а не като параметър на конструктор? В моя случай инжектирането чрез параметър на конструктора е неуспешно и затова се чудя дали има нещо специално за него, което трябва да се избягва. Разбирам, че не е по темата, но ако можете да помогнете, ще бъдем благодарни. - person Haspemulator   schedule 24.07.2013