安卓版匕首:如何在使用MVP时注入上下文



在开发Android应用程序时,我偶然发现了一个问题。我刚开始使用Dagger,所以我知道一些基本概念,但当在教程及其用例的范围之外使用它时,事情就变得不那么清楚了。

所以说正题吧。在我的应用程序中,我使用MVP,如本文所述:http://antonioleiva.com/mvp-android/

因此,一开始我将Interactior类(处理数据的类)注入Presenter类,一切都很好。但后来我实现了使用SQLite数据库的方法,所以现在需要在我的Interactior类中使用Context。

我不知道该怎么做才好?我的临时解决方案是将Dagger从我的应用程序中排除,并在创建Presenter类时在构造函数中传递Context变量,然后在Presenter内创建Interactior类,但我想使用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,那就太好了:)

我希望有人对我正在努力实现的目标有一些经验:)

在您的类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)
    }
}

为了注入上下文,您需要编写一个带有provides方法的模块:

@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方法而不是使用构造函数参数来重新思考您的设计。

编辑:创建根模块

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);
    }
}

最新更新