android - Dagger 和 mvp - 演示者是否应该使用 dagger 进行注入(inject)

标签 android mvp dagger-2

我开始认为在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/

相关文章:

android - SD卡内容存在但看不到

html - 在 gwt 中使用 html 模板

java - 带有异步调用的 Dagger 返回类型

android - 带有 Dagger 2 的 ViewModelProviders,无法掌握概念

java - 如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供 Dagger 2 Activity

android - 如何以编程方式设置CardView的高度?

android - UDP 服务器不接受来自外部的调用

android - MVP:管理 Activity 和 fragment 的最佳实践

design-patterns - MVP是一种设计模式还是一种架构模式? MvC 和 MvvM 怎么样?

android - react 原生 : How to open OS settings in Android and iOS?