在开发Android应用程序时,我偶然发现了一个问题。我刚开始使用Dagger,所以我知道了一些基本概念,但是当在教程范围之外使用它时,它们的用例变得不那么清楚。
所以要明白这一点。在我的应用程序中,我正在使用MVP,如本博文中所述:http://antonioleiva.com/mvp-android/
首先,我将Interactor类(处理数据的类)注入Presenter类,一切正常。但后来我实现了使用SQLite数据库的方法,所以现在需要在我的Interactor类中使用Context。
我无法弄清楚我该如何正确地做到这一点?我的临时修复是将Dagger从我的应用程序中排除,并在创建Presenter类时在构造函数中传递Context变量,然后在presenter中传递Interactor类,但我想使用Dagger。
所以我当前的应用程序看起来有点像这样。
MyActivity implements MyView {
MyPresenter p = new MyPresenter(this, getApplicationContext());
}
MyPresenter中的构造函数
MyPresenter(MyView view, Context context) {
this.view = view;
MyInteractor i = new MyInteractor(context);
}
在MyInteractor
的构造函数中,我将Context
分配给私有变量。
我只需要将MyInteractor
注入MyPresenter
,因为这是需要针对不同实现进行测试的应用程序的一部分。但如果也可以将MyPresenter
注入MyActivity
,那就太好了:)
我希望有人对我正在努力实现的目标有一些经验:)
答案 0 :(得分:6)
在你的班级MyInteractor中:
public class MyInteractor {
@Inject
public MyInteractor(Context context) {
// Do your stuff...
}
}
MyPresenter级
public class MyPresenter {
@Inject
MyInteractor interactor;
public MyPresenter(MyView view) {
// Perform your injection. Depends on your dagger implementation, e.g.
OBJECTGRAPH.inject(this)
}
}
要注入Context,您需要使用提供方法编写一个模块:
@Module (injects = {MyPresenter.class})
public class RootModule {
private Context context;
public RootModule(BaseApplication application) {
this.context = application.getApplicationContext();
}
@Provides
@Singleton
Context provideContext() {
return context;
}
}
将Presenter类注入您的活动并不容易,因为在您的构造函数中,您有此MyView参数,Dagger无法设置该参数。您可以通过在MyPresenter类中提供setMyView方法而不是使用构造函数参数来重新考虑您的设计。
编辑:创建RootModule
public class BaseApplication extends Application {
// Store Objectgraph as member attribute or use a Wrapper-class or...
@Override
public void onCreate() {
super.onCreate();
OBJECTGRAPH = ObjectGraph.create(getInjectionModule());
}
protected Object getInjectionModule() {
return new RootModule(this);
}
}