Dagger with Android:如何在使用 MVP 时注入上下文?
Dagger with Android: How to inject context when using MVP?
在开发 Android 应用程序时,我遇到了一个问题。我刚开始使用 Dagger,所以我知道一些基本概念,但是当在教程和用例范围之外使用它时,事情就变得不太清楚了。
进入正题。在我的应用程序中,我正在使用此博客 post 中所述的 MVP:http://antonioleiva.com/mvp-android/
所以一开始我将 Interactor class(处理数据的那个)注入 Presenter class,一切正常。但是后来我实现了使用 SQLite 数据库的方法,所以现在需要在我的 Interactor class.
中使用 Context
我不知道该如何正确执行此操作?我的临时修复是从我的应用程序中排除 Dagger,并在创建 Presenter class 时在构造函数中传递 Context 变量,然后在 Presenter 中传递 Interactor class,但我想使用 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
,那就太好了 :)
我希望有人对我正在努力实现的目标有一些经验:)
在您的 class MyInteractor 中:
public class MyInteractor {
@Inject
public MyInteractor(Context context) {
// Do your stuff...
}
}
MyPresenter-class
public class MyPresenter {
@Inject
MyInteractor interactor;
public MyPresenter(MyView view) {
// Perform your injection. Depends on your dagger implementation, e.g.
OBJECTGRAPH.inject(this)
}
}
为了注入上下文,您需要编写一个带有提供方法的模块:
@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-class 注入到您的 activity 并不是那么容易,因为在您的构造函数中您有这个 MyView 参数,它不能被 Dagger 设置。您可以通过在 MyPresenter-class 中提供 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);
}
}
在开发 Android 应用程序时,我遇到了一个问题。我刚开始使用 Dagger,所以我知道一些基本概念,但是当在教程和用例范围之外使用它时,事情就变得不太清楚了。
进入正题。在我的应用程序中,我正在使用此博客 post 中所述的 MVP:http://antonioleiva.com/mvp-android/
所以一开始我将 Interactor class(处理数据的那个)注入 Presenter class,一切正常。但是后来我实现了使用 SQLite 数据库的方法,所以现在需要在我的 Interactor class.
中使用 Context我不知道该如何正确执行此操作?我的临时修复是从我的应用程序中排除 Dagger,并在创建 Presenter class 时在构造函数中传递 Context 变量,然后在 Presenter 中传递 Interactor class,但我想使用 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
,那就太好了 :)
我希望有人对我正在努力实现的目标有一些经验:)
在您的 class MyInteractor 中:
public class MyInteractor {
@Inject
public MyInteractor(Context context) {
// Do your stuff...
}
}
MyPresenter-class
public class MyPresenter {
@Inject
MyInteractor interactor;
public MyPresenter(MyView view) {
// Perform your injection. Depends on your dagger implementation, e.g.
OBJECTGRAPH.inject(this)
}
}
为了注入上下文,您需要编写一个带有提供方法的模块:
@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-class 注入到您的 activity 并不是那么容易,因为在您的构造函数中您有这个 MyView 参数,它不能被 Dagger 设置。您可以通过在 MyPresenter-class 中提供 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);
}
}