我开始认为在mvp中,dagger不应该在presenter中使用。构造 dagger 的常用方法是使用全局组件并具有用于确定图形范围的子组件。该全局组件通常在创建 appmodule.java 类时将 applicationContext 作为参数。给出应用程序上下文可以让生活变得更轻松。
这一切都很好,但如果我使用全局组件甚至子组件中的模块,则应该传入上下文。因此,这意味着如果我用 dagger 注入(inject)演示者,它将与 applicationContext 绑定(bind)。这使得作为 junit 进行测试变得困难。 Android 代码不应该出现在 Presenter 中。
所以我问的是,最好的做法是仅在 Activity fragment 广播接收器和服务中使用 dagger 吗?就 mvp 架构而言就是这样。另一种解决方案可能是设计另一个 dagger 组件,但不是与 appcomponent 或 applicationContext 无关的子组件。常见的做法是什么?
更新: 让我们看一个真实的例子:
通常我们会创建一个在应用程序覆盖中接近的appComponent,如下所示:
public class MyApplication extends Application {
private AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = initDagger(this);
}
public AppComponent getAppComponent() {
return appComponent;
}
protected AppComponent initDagger(PomeloApplication application) {
return DaggerAppComponent.builder()
.appModule(new AppModule(application))
.build();
}}
然后,例如在演示者中,我们将在构造函数中执行此操作:
public WelcomePresenter(Context context) {
super(context);
presenterComponent = ((MyApplication) context).getAppComponent();
presenterComponent.inject(this);
}
因为我想要 Dagger 提供者的应用程序上下文,所以我最终迫使调用者依赖于上下文对象。基本上,在获得上下文之前,您无法获取 AppComponent 模块,因此您可以将其转换为“MyApplication”并从组件注入(inject)?所以我在想为什么这个 Dagger 模式让我强制演示者有一个上下文?
即使我们使用了子组件,它仍然依赖于 AppComponent,然后在我们的测试用例中,我们必须处理正在创建的应用程序上下文以获取 dagger 注入(inject)。
所以我认为应该有一个规则 - 在 MVP 中更喜欢手动构造函数注入(inject)而不是 Dagger 注入(inject) 因为类不应该知道它是如何注入(inject)的。被注入(inject)的东西不应该关心它是如何注入(inject)的。
dagger.android根据已接受的答案概述了我正在谈论的问题。
最佳答案
我也同意这样的说法:“在演示者中不包含 Android 相关代码始终是一个好主意,并且 dagger 不会干扰这一点。”
首先,我想提醒大家的是,从 dagger 2.10 版本开始,你可以使用 dagger.android
包简化了 Activity 和 fragment 中的注入(inject),因此您无需在应用程序中使用 MyApplication
转换。
其次,为什么不将 WelcomePresenter
注入(inject)到 Activity 或 Fragment 中,反之亦然?
关于android - Dagger 和 mvp - 演示者是否应该使用 dagger 进行注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44476006/