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

2024-04-01

我开始认为在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根据已接受的答案概述了我正在谈论的问题。


我也同意这样的说法:“在演示者中不包含 android 相关代码总是一个好主意,并且 dagger 不会干扰这一点。”

首先,我想提请注意的是,从 dagger 2.10 版本开始,你可以使用dagger.android https://google.github.io/dagger//android.html包简化了活动和片段中的注入,因此您不需要使用MyApplication跨应用程序投射。

二、为什么不注射WelcomePresenter进入活动或片段,反之亦然?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dagger 和 mvp - 演示者是否应该使用 dagger 进行注入 的相关文章

  • 将项目升级到Android Studio 1.0(Gradle问题)

    首先 我对 android 开发 android studio gradle 非常陌生 所以如果我问了一个愚蠢的问题 请原谅我 我的团队一直在使用 android studio 的 beta 版本开发一个项目 我刚刚安装了新版本 1 0 并
  • 这个方法比 Math.random() 更快吗?

    我是一名初学者 目前已经开始开发一款使用粒子群优化算法的 Android 游戏 我现在正在尝试稍微优化我的代码 并且 for 循环中有相当多的 Math random 几乎一直在运行 所以我正在考虑一种方法来绕过并跳过所有 Math ran
  • 在我的 Android 应用程序中使用 ServerValue.TIMESTAMP

    我读过很多相关的 stackoverflow 问题 ServerValue TIMESTAMP 但我不知道如何在我的应用程序中使用它 我需要获取帖子创建的时间戳 时间戳应该添加到与帖子的 uid 作者等相同的位置 代码片段其中写这篇文章Fi
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • 使用一个 apk 安装两个应用程序

    我有 2 个应用程序 1 内容提供者 2 使用此 ContentProvider 的应用程序 我需要使用单个 apk 文件安装这 2 个应用程序 我想在 Eclipse 中同时推送这两个应用程序 如果我将另一个项目添加到一个应用程序的构建路
  • 如何访问android库项目中的资源

    我正在构建一个 android 库项目 它内部需要一些静态资源 图像 xml 等 然后我想知道我可以把这些资源放在哪里以及如何访问它们 既然我把资源放到了assets文件夹 我使用 AssetManager 来访问资源 public cla
  • Android:我可以创建一个不是矩形的视图/画布吗?圆形的?

    我有一个圆形视图 悬停在主要内容上方 gt 从屏幕出来的 z 轴方向 当有人点击屏幕时 我希望选择主要内容或悬停在上方的视图 当它覆盖主视图时 到目前为止效果很好 我在透明画布上有一个圆形物品 这意味着您可以看到该圆圈之外的背景的所有内容
  • 如何在活动中的必填字段中显示 * 符号

    我需要在活动中的必填字段中显示 符号 你能建议我怎样才能做到这一点吗 任何帮助 将不胜感激 我想说 作为必填字段的标记不遵循本机 Android 主题 的组合setHint and setError对于 Android 应用程序来说看起来更
  • 更改卡片高度即更改 Jetpack 中与 Material 3 组合的卡片颜色

    我正在使用 Card 可组合项 我希望它的颜色为白色 但是当我向它添加一些高度时 它的颜色会更改为更像主要容器颜色 我看过文档 其中有一种称为高程覆盖的东西 但找不到说明如何使用它的示例 这是我的代码 Card modifier Modif
  • Android中如何检测WIFI连接何时建立?

    我需要检测何时通过 WIFI 建立网络连接 发送什么广播来确定已建立有效的网络连接 我需要验证是否存在有效的 HTTP 网络连接 我应该监听什么以及需要进行哪些额外测试才能知道是否存在有效连接 您可以注册一个BroadcastReceive
  • 如何在 NumberPicker 中一次显示 3 个以上的值

    我正在创建一个数字选择器 如下图所示 但如果有可用空间 我想显示 3 个以上的值 该选择器有 20 个项目 并且有足够的空间来显示 3 个以上的值 这可以使用 NumberPicker 来完成吗 只需以编程方式设置numberPicker
  • 使用 Android Studio 进行调试永远停留在“等待调试器”状态

    UPDATE The supposed重复是一个关于陷入 等待调试器 执行时Run 而这个问题就陷入了 等待调试器 执行时Debug 产生问题的步骤不同 解决方案也不同 每当我尝试使用Android Studio的调试功能时 运行状态总是停
  • Emma 不生成coverage.ec

    我设置了艾玛 它曾经对我有用 然后我们更改了源代码 现在它没有生成coverage ec根本不 它确实生成coverage em 测试临近结束时 出现错误消息 exec INSTRUMENTATION CODE 0 echo Downloa
  • 适用于 Android 的 Google 云端硬盘\文档 API

    我在几个小时内将 Dropbox 与我的应用程序集成 因为 SDK 描述清晰并且有很好的使用示例 Google Drive 似乎只有一个 一刀切 的 Gdata SDK 它非常重 有很多依赖项 它使我的应用程序的大小增加了三倍 而且不是很直
  • 如何制作在手机和平​​板电脑上使用的响应式Android应用程序?

    我创建了一个 Android 应用程序 当我运行我的应用程序时Mobile Phone它工作得很好 但是当我跑进去时Tablet应用程序的布局已更改 那么 如何制作响应式Android应用程序用于Mobile并且也在Tablet 在Andr
  • SDK >=26 仍需要 mipmap/ic_launcher.png?

    在 Android 中 有两种指定启动器图标 可以说是应用程序图标 的方法 老 方式 在 mipmap 文件夹中指定不同的 png 文件 通常命名为 ic launcher png 但可以通过以下方式设置名称android icon mip
  • 剪切评级栏中的图像

    我制作了自己的评级栏 花朵图像有 4 种尺寸 xdpi hdpi 等 从 24px24px 到 64x64px
  • 使用Intent拨打电话需要权限吗?

    在我的一个应用程序中 我使用以下代码来拨打电话 Intent intent new Intent Intent ACTION CALL Uri parse startActivity intent 文档说我确实需要以下清单许可才能这样做
  • Flash 对象未显示在phonegap android 中

    我已经在 android 手机间隙创建了一个应用程序 我有一个屏幕 我想显示一个静态 flash obj 所以我在屏幕 HTML 页面中放入了以下代码
  • 将焦距(以毫米为单位)转换为像素 - Android

    在 Android 中 我当前正在访问camera s焦距通过使用getFocalLength in Camera1 Camera2不是一个选择 我正在尝试完全填充当前的计算 focal length pix focal length m

随机推荐

  • 删除正则表达式中的文字字符

    我有以下字符串 Qpipe name office1 E 我正在使用一个简化的正则表达式库 它不支持 Q and E 我尝试删除它们 s replaceAll Q replaceAll E 但是 我收到错误Caused by java ut
  • 我们可以在二维码中保存/存储多少数据/信息?

    我想使用这个脚本https github com jeromeetienne jquery qrcode https github com jeromeetienne jquery qrcode 或者有更好的解决方案吗 我喜欢做的是将一些小
  • 如何才能正确的将这个表单数据提交到MongoDB呢?

    我在尝试将我的 React 应用程序与 mongodb 数据库连接起来时遇到了非常困难的时间 在我之前提出的关于如何做的建议的问题中连接 React 和 MongoDB https stackoverflow com questions 4
  • 使用 JWT 的 Core 2.0 API 身份验证返回未经授权的信息

    我正在尝试将 JWT 令牌身份验证添加到我的 Net Core 2 0 应用程序中 我有一个简单的控制器 它返回用于测试的用户列表 Authorize Route api controller public class UsersContr
  • SQL Server 为浮点数提供了额外的精度?

    精度损失是一回事 但是精度增益 我有一个带有以下坐标的文本文件 41 88694340165634 87 60841369628906 当我将其粘贴到 SQL Server Mgmt Studio 表视图中时 结果如下 41 8869434
  • jQuery 表单转发器和 select2 不能一起工作

    我正在使用 Select2 和 jQuery 表单转发器 https github com DubFriend jquery repeater https github com DubFriend jquery repeater 我已经在
  • php错误日志,如何删除重复项/查找唯一错误[重复]

    这个问题在这里已经有答案了 有没有办法只搜索错误日志以查找唯一的错误 原因是我有很多重复的错误 并且不想错过罕见的错误 我将如何编写一个自定义脚本来解析错误日志 并过滤掉除日期时间之外的所有重复项 来分析 var log apache2 e
  • 理解 atoi() 函数

    我是一名 Python 程序员 正在从 K R 书中学习 C 这似乎是一个非常微不足道的问题 但我仍然被难住了 下面附上 K R RIP Ritchie 书中的一段代码 它实现了 atoi 函数 atoi s convert s to in
  • Tkinter Windows 按键事件

    Tkinter 中 Windows 键的事件是什么 我使用的是 Linux 但我想要 Linux 和 Windows 的答案 如果 Mac 有类似的密钥 请随时告诉我它的绑定 我想左右 windows 键有不同的事件 Windows 键似乎
  • 将用户的时区与网站办公地点的时区进行比较

    我正在开发一个项目 我需要在联系人区域向网站访问者显示一条消息 例如 联系电话 91 99 3241 5285 You can call us now 该消息在上面一行中突出显示 现在我的问题是 如何将用户的时区与公司办公室的工作时间进行比
  • 从 Fluent Nhibernate 获取表名

    在流畅的 nhibernate 中设置映射后 有没有办法从类类型中获取实体的表名 我读过常规的 nhiberante 你可以做类似的事情cfg GetClassMapping typeof Employee 我想做这样的事情来检索数据库表名
  • 有没有办法在我的代码中使用 Typescript.Collections.HashTable ?

    我在 Typescript 编译器的代码中看到了 HashTable 的实现 在文件 src compiler core hashTable ts 中 你知道有没有办法可以直接在我的 Typescript 项目中使用它 您可以通过定义接口来
  • 将向量数组作为函数参数传递(值不会改变)

    我在一类中有一组向量 class MeasurementData private std vector
  • laravel 5 根据路由返回 HTML 或 JSON

    我想显示不同的输出 JSON 或 HTML 我无法使用 Request ajax 功能 因为我只是收到正常请求 JSON 响应不是基于 XHR 请求 是否有可能区分不同路线的输出 例如 检查控制器是否由前缀为 mob 的路由调用 然后根据该
  • 检测从 C# 应用程序最小化的所有窗口

    如何检测从 C 应用程序最小化的所有窗口 其他应用程序 使用这里的示例http pinvoke net default aspx user32 EnumDesktopWindows http pinvoke net default aspx
  • 单独运行时单个规范通过,但运行所有规范时失败

    我的 foo controller spec rb 中有 30 个规范 当我使用规范运行整个文件时 我得到 4 个失败和 2 个待处理 当我单独运行 4 个失败的规范时 其中 3 个仍然失败 但其中一个通过了 起初我认为这是一个数据库问题
  • C++ New 与 Malloc 用于对象的动态内存数组

    我有一个 Bullet 类 它的构造需要几个参数 但是 我使用动态内存阵列来存储它们 我正在使用 C 所以我想通过使用 new 运算符来分配内存来符合它的标准 问题是当我分配数组时 new 运算符要求构造函数参数 而当时我没有 我可以使用
  • 从表中删除*不起作用[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试删除all rows从表中但它不起作用 当我做echo mydb gt error 它给了我以下内容 You have an e
  • Node-PerfectAPI vs Restify.js vs ExpressJS vs Node-APIServer [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是 ExpressJS 的新手 我想为我的服务创建 API 该服务将直接由其他服务器使用 并且一部分也由移动应用程序 浏览器使用 我刚刚发现了
  • Dagger 和 mvp - 演示者是否应该使用 dagger 进行注入

    我开始认为在mvp中 匕首不应该在presenter中使用 构造 dagger 的常用方法是使用全局组件并具有用于确定图形范围的子组件 该全局组件通常在创建 appmodule java 类时将 applicationContext 作为参