问题标签 [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 回答
1313 浏览

android - 如何在 ui-thread 上注入并等待注入完成后再继续?

在 Dagger 中,您必须在 UI 线程上注入。运行 JUnit 时,您并未在 UI 线程上运行。为了让它工作,我们必须在 UI 线程上发布一个 Runnable 并等待它完成注入。

我的代码如下所示:

问题是调用latch.await() 时myRunnable 没有启动。运行 JUnit 时让 Dagger 注入的最佳方法是什么?

0 投票
1 回答
408 浏览

android - Dagger & Android - 测试中的竞争条件?

我正在使用 Dagger 将依赖项注入到 Android 项目中的活动中。所有提供者都保存在一个模块中,该模块由Application子类存储和管理。活动将它们的依赖项注入onCreate(),从上下文中获取模块。

在测试中,我有时需要将默认模块换成另一个。我正在使用ActivityAndroidTestCase2. 我在调用之前获取应用程序上下文getActivity(),然后替换模块,如下所示:

MyApplication代码:

可悲的是,测试有时会失败——这就是sleep()第一个代码片段中出现的原因。线程休眠的时间越长,失败的机会就越小,但它并不能永远解决问题。

关于导致这种奇怪行为的原因以及如何解决这个问题的任何想法?

0 投票
3 回答
5407 浏览

android - 使用 Dagger 进行 Android 功能测试

我正在尝试使用 Mockito & Dagger测试 Activity 。我已经能够在我的应用程序中向 Activity 注入依赖项,但是在测试 Activity 时,我无法向 Activity 注入模拟。我应该注入 Activity 来测试还是让 getActivity() 创建它?

0 投票
2 回答
6278 浏览

dependency-injection - 带有构造函数参数的匕首模块?

在 Guice 中,我可以完全控制何时构建模块,并使用一些带有我安装的构造函数参数的模块。

然而,在 Dagger 中,引用其他模块的方法是通过 @Module 包含注释,并且没有向我提供创建要安装的模块的相同方法。

是否可以从具有构造函数参数的多个模块创建一个健全的 ObjectGraph?尤其是可以与 dagger-compiler 一起使用,并且不会遇到循环图的?

0 投票
5 回答
12842 浏览

android - 使用 Dagger 对构造函数进行依赖注入

所以,我目前正在重新设计我的一个 Android 应用程序以使用Dagger。我的应用程序又大又复杂,我最近遇到了以下情况:

对象 A 需要一个特殊的 DebugLogger 实例,它是注入的完美候选者。我可以通过 A 的构造函数注入它,而不是传递记录器。这看起来像这样:

到目前为止,这是有道理的。但是,A需要由另一个类B来构造。必须构造多个A的实例,所以按照Dagger的做事方式,我简单地将aProvider<A>注入B:

好的,到目前为止很好。但是等等,突然 A 需要额外的输入,例如一个称为“数量”的整数,这对其构造至关重要。现在,我的 A 构造函数需要如下所示:

突然,这个新参数干扰了注射。此外,即使这确实有效,我也无法在从提供者检索新实例时传递“金额”,除非我弄错了。我可以在这里做几件事,我的问题是哪一个是最好的?

setAmount()我可以通过添加一个预期在构造函数之后调用的方法来重构 A。然而,这很丑陋,因为它迫使我延迟 A 的构建,直到填写“数量”。如果我有两个这样的参数,“数量”和“频率”,那么我将有两个设置器,这意味着要么复杂的检查以确保在调用两个 setter 后恢复 A 的构造,否则我将不得不在组合中添加第三种方法,如下所示:

另一种选择是我不使用基于构造函数的注入,而是使用基于字段的注入。但是现在,我必须公开我的领域。这不适合我,因为现在我有义务将我的班级的内部数据透露给其他班级。

到目前为止,我能想到的唯一有点优雅的解决方案是对提供者使用基于字段的注入,如下所示:

即使如此,我也不确定时机,因为我不确定 Dagger 是否会在调用我的构造函数之前注入提供程序。

有没有更好的办法?我只是错过了有关 Dagger 工作原理的一些信息吗?

0 投票
2 回答
1491 浏览

gwt - 如何使用 Dagger 注入 Servlet?

如何使用 Dagger 将对象注入 Servlet?

由于 servlet 容器自己实例化了 Servlet,因此它们不是用 Dagger 创建的。因此,我能看到注入它们的唯一机制是通过静态注入,匕首主页警告不要这样做。还有另一种(最佳实践)方法吗?

具体来说,我使用的是 Jetty 和 GWT(我的 servlet 扩展了 RemoteServiceServlet),但我认为这些细节并不重要。

0 投票
1 回答
2556 浏览

dependency-injection - 我可以覆盖匕首中的绑定吗?

如果我有一个类的默认 impl,并且它确实定义了 @Inject 构造函数,那就太好了。系统将其拾取。

如果一个应用程序想用子类覆盖该默认 impl,我可以在其模块中定义一个 @Provides 并在我自己的代码中对该子类调用“new”,而 dagger 则使用该 impl(据我目前所知,这有效)。

但是,如果我想让 dagger 实例化该子类,是否可以在 @Module 中不声明“override=true”的情况下做到这一点?我喜欢没有 override=true 以便构建时的所有重复检查都会给我适当的警告。

当然,一种方法是强制所有应用程序直接声明@Provides。这只会增加臃肿。

我之前使用过 GIN(GWT 的 Guice),您可以通过 .class 引用定义与所需类的绑定,但我在 dagger 中看不到任何类似的东西。

0 投票
1 回答
116 浏览

dependency-injection - 匕首编译中的意外键

我从匕首收到以下错误:

我相信这是因为我有一个没有可注入依赖项的类 - 它有一个空的公共构造函数(带有@Inject),也没有任何东西可以注入成员。我这样做是为了不必为它声明@Provides。请注意,带有@Inject 的类是上面错误消息中列出的类的子类:

这是匕首中的错误,还是我遗漏了什么?

如果我删除 @Inject 并且仍然不将 @Provides 添加到模块中,它当然根本不起作用,因为 dagger 在所有依赖项上都需要 @Inject 或 @Provides。

0 投票
1 回答
1380 浏览

dependency-injection - Dagger 字段注入和入口点

我在我的一个项目中尝试使用匕首,我遇到了这种情况:“只有在我将类声明为模块定义中的入口点时,字段注入才有效。”

这是正确的行为吗?

如果 Messenger.class 未声明为入口点,则以下依赖项不会注入 Messenger 类。构造函数注入器工作正常,但我不想声明多参数构造函数。

0 投票
1 回答
445 浏览

android - Android-Bootstrap mvn clean package错误

我正在尝试使用 android bootstrap:https ://github.com/donnfelker/android-bootstrap 。

我克隆了代码。但是当我尝试应用程序目录中的下一个命令时:

但弄错了。

无法识别符号“入口点”。