问题标签 [dagger]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4467 浏览

android - Dagger 1.x 中的单例

使用 Dagger 时,我发现当我在需要的地方注入它时,我会得到多个单例实例。我已经用@Singleton. 谁能想到为什么会这样?

编辑:

如果有帮助,我的应用程序的结构与 Dagger 的 GitHub ( https://github.com/square/dagger/tree/master/examples/android-activity-graphs ) 中的示例应用程序相同。@Provides我正在尝试在基本活动中获取 Singleton 以及在自定义类中使用的几个第三方Application类。是因为我在每个活动中都将模块添加到原始对象图吗?

(PS:我是Dagger和DI的新手,所以如果你能提供解释以便我学习,我将不胜感激。谢谢。)

0 投票
4 回答
5801 浏览

android - 匕首和嵌套注入

我正在使用Dagger将依赖项注入到 Android 应用程序中,但我偶然发现了一个我不完全确定如何以干净的方式解决的问题。

我想要实现的是实例化助手并将它们注入我的活动中,并且让这些助手也包含注入的成员。

什么有效

我的助手被注入的活动:

创建对象图的应用程序:

当我直接实例化一个 SampleHelper 类时,注入工作完美,该类又接收注入的应用程序上下文:

使用以下模块:

什么不起作用

但是,当我将辅助接口与其实现分开时:

并将其添加到匕首模块:

正如我所预料的那样,上下文没有被注入到我的 SampleHelperImpl 中。现在,我猜这是由于 SampleHelperImpl 是通过直接构造函数调用而不是注入启动的构造函数调用来实例化的,因为 MyModule#provideApplicationContext() 甚至没有被调用,所以我的猜测是我缺少关于 Dagger 的一些东西(这是可能,因为我之前的 DI 经验只包括 Spring)。

关于如何以“干净的匕首”方式将我的上下文注入到我的注入助手实现中的任何想法?

非常感谢!

0 投票
1 回答
202 浏览

android - 活动图和未找到的依赖项

我开始使用匕首,非常喜欢它,但现在面临一些困难。我的场景如下:有一个活动和一个依赖项。依赖项被注入到活动中,并且需要对该活动的引用。像这样:

我正在关注github 中 Dagger 的示例以获取活动图表。所以我在我的项目中创建了一个类似的结构。首先,继承BaseActivity自的类:MainActivity

和模块:

现在,问题: No injectable members on com.example.proto.BaseActivity. Do you want to add an injectable constructor? required by public com.example.proto.ScbeHelper(com.example.proto.BaseActivity)

换句话说,提供者方法由于某种原因ActivityModule.provideActivity()并没有真正提供实例BaseActivity,尽管在我的理解中它设置正确。有人在我的设置中看到错误吗?我在匕首的逻辑中遗漏了什么吗?

提前致谢!

0 投票
1 回答
3765 浏览

android - 在使用 Dagger 进行测试期间用 Mockito 模拟替换 Provider 注入

我正在尝试测试我正在对我的 Android 服务 ( android.app.Service) 所做的一系列更改 - 我正在使用 Dagger 和 Robolectric,我需要用一些模拟替换服务中的字段注入类以减少测试范围.. .make 它(稍微)更像“单位”。

所以,短版...

Providers.of在我的android.app.Service. 如何在单元测试期间用 MockProviders 替换它们?

更长的版本...

这是相关服务代码的样子;

因此,在正常操作下,startService(intent)调用让服务在期间注入它的依赖项onCreate,我们都很好。

在我的测试下,我想用 Mockito 模拟替换注入Provider的 s调用。get()我试图遵循Dagger 测试示例并创建了一个看起来像这样的测试模块;

我期待当我的实际服务代码调用提供者时,get()我会得到Mockito 模拟(那些是我的测试模块@Provides 的模拟)。

这不会发生。我要去这里的方法有什么问题?

0 投票
2 回答
33312 浏览

dependency-injection - Dagger:注入@Named 字符串?

编辑2018-02-08:演示如何在https://github.com/ravn/dagger2-named-string-inject-example上执行此操作的示例项目- 注意:整个源代码在一个文件中


我正在研究 dagger 是否可以代替我们的 guice(因为我们的部署 Java 平台很慢)。

我在运行时构造了一个配置字符串映射,我希望根据需要注入 dagger。

例如,如果我有

我想在价值中注入“价值”。

源代码中的示例没有任何 @Named 用法。只是尝试给出以下异常:

我应该如何处理这个?

0 投票
4 回答
5335 浏览

android - Dagger 虽然可以生成点文件,但无法创建对象图

我正在努力在现有应用程序中设置 Dagger (1.0.1)。它被配置为使用 ProGuard,但我为这个测试禁用了它-dontobfuscate

当我启用 dagger-compiler 时,它能够成功地生成一个带有依赖关系图的点文件,但是当我删除编译器并在发布模式下构建应用程序时,它在启动过程中崩溃,抱怨它无法创建对象图。

我看到MyAppBaseActivity它与生成的点文件的依赖关系CroutonManagerConnectionMonitor显示在生成的点文件中,所以根据这个评论,我希望这可以工作。AFAIK 如果有问题,应该由我用来生成点文件的启用编译器的构建检测到。


更新:

我之前说过

在调试模式下它永远不会失败

但经过进一步测试后并非如此:在调试模式下它不会失败,因为 ProGuard 被禁用,而在发布模式下它默认启用。如果我在 Release 模式下构建应用程序但跳过 ProGuard,我也不会收到错误并且应用程序成功启动。所以这个问题肯定和我的 ProGuard 配置有关。

0 投票
2 回答
1487 浏览

java - 如何在 Dagger 图中生命周期管理对象

我在 Dagger 中看不到对生命周期管理的任何支持。只有 DI,@PostConstruct 或 @PreDestroy 没有。

我希望 Dagger 以与 Spring 相同的方式启动/停止对象是图形。我怎样才能做到这一点?

0 投票
1 回答
6480 浏览

dagger - 默认构造函数上的匕首

我正在尝试让Dagger开始我的项目。

但是,在编译过程中,我的一个类出现以下异常:

错误:Foo 上没有可注入成员。你想添加一个可注入的构造函数吗?

但是,该类没有依赖项,因此使用默认的无参数构造函数:

我真的需要像下面这样添加一个可注入的无参数构造函数吗?

0 投票
1 回答
520 浏览

dependency-injection - Dagger递归注入

我正在尝试匕首,我当前的用例由下面的代码表示。我认为 Dagger 会递归地注入似乎不会发生的对象。

我在top.inner.

我不知道这是否是 Dagger 的期望行为,但如果是的话,你能否建议我可能的方法来做到这一点,而不是诉诸于对每个对象进行注入。

编辑我改变了一点用例。我忘记了一个小细节:(。

谢谢

0 投票
1 回答
837 浏览

java - 是否可以在 Dagger 和 CDI 之间共享通用 JSR 330 代码?

我是Agorava的技术负责人,这是一个帮助使用社交网络数据的框架。

今天,Agorava 构建在 CDI 之上,以简化其在 Java EE 堆栈中的使用,但我们希望提供一个带有 Dagger 的实现,以便为 Android 提供更轻的解决方案。

我的问题是:我们可以在 CDI 和 Dagger 实现之间共享通用的 JSR 330 兼容代码吗?换句话说,Dagger 是否可以在带有 JSR 330 注释的 jar 中编译代码,并且源代码在 Dagger 特定的 Jar 中扩展或使用此代码(带有@Provides@Modules其他 Dagger 特定项)?

如果答案是否定的,那么用 Dagger 编译器编译我的通用 JSR 330 jar 并在我的 CDI 实现中使用它有什么问题吗?更准确地说@Inject,限定符和其他 JSR 330 细节将在运行时仍然可用,并且带有这些注释代码的类是否不会受到 Dagger 编译器的影响?最后,是否有一种对 Dagger 生成的代码(类名、注释)的跟踪器,以允许 CDI 检测并忽略它?