Я использую 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 включал только Spring).
Есть идеи о том, как внедрить мой контекст в мою внедренную реализацию помощника «чистым кинжалом»?
Большое спасибо!
SampleHelper
, а не как параметр конструктора? В моем случае инъекция через параметр конструктора не работает, и поэтому мне интересно, есть ли в этом что-то особенное, чего следует избегать. Я понимаю, что это не по теме, но если вы можете помочь, я буду признателен. - person Haspemulator   schedule 24.07.2013