java - Dagger 2 : Injecting user inputted parameter into object

标签 java android dagger-2

说我有一个类实用工具 接受一个对象 - 类的实例 validator .

因为我想避免在 Util 中实例化 Validator 类,所以我通过构造函数传入它:

public class Util {

   @Inject
   public Util(Validator validator) {

   }


}

我有一个提供 Validator 实例的模块:
@Provides
@Singleton
Validator provideValidator() {
    return Validator.getInstance();
}

和 Util 类的一个实例:
@Provides
Util provideUtil(Validator validator) {
    return new Util(validator);
}

我连接了一个组件,它会给我一个 Util 实例:
Util getUtil()

所以在我的 Activity 中,我可以这样称呼它:
Util myUtil = getComponent.getUtil();

所有这些都可以正常工作 - myUtil 在实例化时有一个正确的 Validator 类实例。

现在我想传入一个名为 的字符串变量地址 (这是通过 UI 的用户输入)。我想更改构造函数,因此我传入了 Validator 的实例和用户输入的字符串:
@Inject
public Util(Validator validator, String address) {

}

我只是无法理解如何传递第二个参数。有人能告诉我怎么做吗?

理想情况下,我想实例化 Util 如下:
Util myUtil = getComponent.getUtil(txtAddress.getText());

最佳答案

几周前我开始研究 Dagger 2 时,我和你有同样的问题。我发现很难获得有关此(以及大多数其他与 Dagger 2 相关的问题)的信息,所以我希望这会有所帮助!
最基本的答案是你不能。您正在寻找的是一种叫做辅助注入(inject)的东西,它不是 Dagger 2 的一部分。其他一些依赖注入(inject) (DI) 框架,例如 Guice ,确实提供此功能,因此您可以查看这些功能。当然,仍然有一些方法可以使用 Dagger 2 完成您想做的事情。
工厂工厂工厂
结合 DI 做您想做的事情的标准方法是使用工厂模式。基本上,您创建一个可注入(inject)的工厂类,它采用运行时参数,例如 address作为它提供的对象创建方法的参数。
在你的情况下,你需要一个 UtilFactory Dagger 2 向其中注入(inject)了 Validator在实例化时提供方法 create(String address)创建 Util 的实例. UtilFactory应该保留对 Validator 的注入(inject)实例的引用以便它拥有创建 Util 实例所需的一切在 create方法。
为许多此类工厂编写代码可能很麻烦。你绝对应该看看AutoFactory ,这减轻了一些负担。 Guice 的辅助注入(inject)似乎与 Dagger 2 + AutoFactory 非常相似(尽管语法糖更好)。
更多模块/组件
我怀疑这是您在这种情况下想要做的事情,但是您可以创建一个提供地址的模块(并实例化一个新组件)。您不必为每个可能的地址创建一个新的 @Module 类。相反,您可以将地址作为参数传递给模块的构造函数。您可以按照teano的建议使用@BindsInstance-annotation来实现类似的结果。
我不确定这是否是一种反模式。对我来说,这在某些情况下似乎是可以接受的路线,但仅当您实际使用相同的路线时,例如用于初始化“许多”对象的地址。您绝对不想为每个需要注入(inject)的对象实例化一个新组件和一个新模型。它效率不高,如果您不小心,最终会得到比没有 Dagger 时更多的样板代码。
不要(总是)使用 DI:可注入(inject)物与可再生物
在学习 DI 框架时,对我非常有用的一点是,认识到使用 DI 框架并不意味着您必须通过 DI 来初始化所有对象。作为一个经验法则:注入(inject)你在编译时知道的并且与其他对象有静态关系的对象;不要注入(inject)运行时信息。
我想 this是关于这个主题的好帖子。它引入了“可再生能源”和“可注入(inject)药品”的概念。

  • Injectables 是靠近 DI 图根的类。这些类的实例是您希望 DI 框架提供和注入(inject)的对象类型。管理器或服务类型对象是可注入(inject)的典型示例。
  • Newables 是位于 DI 图边缘的对象,或者根本不是 DI 图的一部分。 Integer , Address等等都是newables的例子。

  • 从广义上讲,newables 是被动对象,注入(inject)或模拟它们没有意义。它们通常包含您的应用程序中的“数据”,并且仅在运行时可用(例如您的地址)。 Newables 不应该保留对可注入(inject)物的引用,反之亦然(这篇文章的作者将其称为“可注入(inject)/可再生分离”)。
    实际上,我发现在可注入(inject)物和可再生物之间做出明确区分并不总是容易或不可能的。不过,我认为它们是很好的概念,可以用作您思考过程的一部分。在为您的项目添加另一个工厂之前一定要三思!
    在你的情况下,我认为治疗 Util 是有意义的。作为一个可注入(inject)和地址作为一个新的。这意味着地址不应该是 Util 的一部分。类(class)。如果你想使用 Util 的实例例如验证/...地址,只需将要验证的地址作为参数传递给验证/...方法。

    关于java - Dagger 2 : Injecting user inputted parameter into object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37516736/

    相关文章:

    java - 如何在 Eclipse 中监听项目删除?

    java - 覆盖 Play Framework 中 POST 请求的默认 JSON 解析

    java - 如何使用 TCP/IP 将消息发送到 java 中的多播地址?

    Android在Adapter的GetView方法中获取ListView的宽度

    java - Dagger + MVP - 在模型中注入(inject) Presenter 时出现问题

    android - 为什么将 Dagger 与 Android 架构组件一起使用

    java - 在谷歌日历 java 上设置事件 ID

    android - 检查url是否被缓存webview android

    android - 自定义主题对话框中的 EditText 主题

    android - Dagger2 单例注释不起作用