Кинжал 2 инъекции базового класса
В Dagger 1 у меня была настройка базового класса, чтобы он мог обрабатывать создание графа области действия и вставлять зависимости в текущий объект. Например...
public abstract class MyBaseActivity extends Activity {
private ObjectGraph graph;
protected void onCreate(Bundle savedInstanceState) {
graph = ((MyApp) getApplication()).plus(getModules());
graph.inject(this);
}
protected Object[] getModules();
}
public class MyClass extends MyBaseActivity {
@Inject SomeDep someDep;
@Override
protected Object[] getModules() {
return new Object[/* Contains a module that provides SomeDep */];
}
}
Это позволило каждому подклассу дополнить свой собственный набор модулей в дополнение к стандартному прикладному модулю.
После игры с Dagger 2 кажется невозможным справиться с подобным сценарием ...
public abstract class MyBaseActivity extends Activity {
private MyBaseActivityComponent component;
protected void onCreate(Bundle savedInstanceState) {
component = ((MyApp) getApplication()).component().plus(/* Can not accept an array */);
component.inject(this);
}
}
Я обошел все вышеизложенное, изменив MyBaseActivityComponent так, чтобы в нем были перечислены все возможные модули, которые он может использовать ...
@Subcomponent(modules = {
Module1.class,
Module2.class
})
public interface MyBaseActivityComponent {
public void inject(MyBaseActivity activity);
}
Так что теперь я могу сделать что-то вроде этого ...
public abstract class MyBaseActivity extends Activity {
private MyBaseActivityComponent component;
protected void onCreate(Bundle savedInstanceState) {
component = ((MyApp) getApplication()).component().plus(new Module1(), new Module2());
component.inject(this);
}
}
Но теперь у меня есть проблема, когда инъекция будет вводить зависимости для MyBaseActivity, но не для его подклассов. Предложения?