我开始认为在mvp中,匕首不应该在presenter中使用。构造 dagger 的常用方法是使用全局组件并具有用于确定图形范围的子组件。该全局组件通常在创建 appmodule.java 类时将 applicationContext 作为参数。给出应用程序上下文可以让生活变得更轻松。
这一切都很好,但如果我使用全局组件甚至子组件中的模块,则应该传入上下文。因此,这意味着如果我用 dagger 注入演示者,它将与 applicationContext 绑定。这使得作为 junit 进行测试变得困难。 Android 代码不应该出现在 Presenter 中。
所以我问的是,最好的做法是仅在活动片段广播接收器和服务中使用 dagger 吗?就 mvp 架构而言就是这样。另一种解决方案可能是设计另一个 dagger 组件,但不是与 appcomponent 或 applicationContext 无关的子组件。常见的做法是什么?
UPDATE:让我们看一个真实的例子:
通常我们会创建一个在应用程序覆盖中接近的 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);
}
因为我想要匕首提供者的应用程序上下文,所以我最终迫使调用者依赖于上下文对象。基本上,在获得上下文之前,您无法获取 AppComponent 模块,因此您可以将其转换为“MyApplication”并从组件注入?所以我在想为什么这个匕首模式让我强迫演示者有一个上下文?
即使我们使用子组件,它仍然依赖于 AppComponent,然后在我们的测试用例中,我们必须处理正在创建的应用程序上下文以注入 dagger。
所以我认为应该有一个规则 - 在 MVP 中更喜欢手动构造函数注入而不是匕首注入
因为类不应该知道它是如何注入的。被注入的东西不应该关心它是如何注入的。
匕首.android https://google.github.io/dagger//android.html根据已接受的答案概述了我正在谈论的问题。