- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
说我有一个类实用工具 接受一个对象 - 类的实例 validator .
因为我想避免在 Util 中实例化 Validator 类,所以我通过构造函数传入它:
public class Util {
@Inject
public Util(Validator validator) {
}
}
@Provides
@Singleton
Validator provideValidator() {
return Validator.getInstance();
}
@Provides
Util provideUtil(Validator validator) {
return new Util(validator);
}
Util getUtil()
Util myUtil = getComponent.getUtil();
@Inject
public Util(Validator validator, String address) {
}
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)药品”的概念。
Integer
, Address
等等都是newables的例子。 Util
是有意义的。作为一个可注入(inject)和地址作为一个新的。这意味着地址不应该是
Util
的一部分。类(class)。如果你想使用
Util
的实例例如验证/...地址,只需将要验证的地址作为参数传递给验证/...方法。
关于java - Dagger 2 : Injecting user inputted parameter into object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37516736/
我有两个文本输入元素 A 和 B。 我希望用户能够从 A 中选择部分或全部文本并拖动到 B,但文本不会从 A 中消失。 假设“A”包含“quick brown fox”,用户突出显示“fox”一词并将
我正在一个网站上工作,如果在提交表单之前数字不在最小值和最大值之间,我希望数字输入能够自行更正。我的代码如下: HTML: JavaScript: function CorrectOverUnder
在检查输入值是否存在并将其分配给变量时,我看到了两种实现此目的的方法: if(Input::has('id')) { $id = Input::get('id'); // do som
我意识到 有一个 border-box盒子模型,而有一个 content-box盒子模型。此行为存在于 IE8 和 FF 中。不幸的是,这使我无法将这种样式应用于大小均匀的输入: input, tex
在 Polymer 文档 ( https://elements.polymer-project.org/elements/iron-input ) 中,我发现: 而在另一个官方文档(https://
我使用 jquery 添加/删除输入 我使用append为日期/收入添加多个Tr 我还使用另一个附加来添加多个 td 以获取同一日期 Tr 中的收入 我添加多个日期输入,并在此表中添加多个收入输入 我
Python3 的 input() 似乎在两次调用 input() 之间采用旧的 std 输入。有没有办法忽略旧输入,只接受新输入(在 input() 被调用之后)? import time a =
在一些教程中,我看到了这些选择器: $(':input'); 或 $('input'); 注意“:”。 有什么不同吗? 最佳答案 $('input') = 仅包含元素名称,仅选择 HTML 元素。 $
我有下一个 html 表单: Nombre: El nombre es obligatorio. Solo se pe
有两种方法可以在组件上定义输入: @Component({ inputs: ['displayEntriesCount'], ... }) export class MyTable i
input: dynamic input is missing dimensions in profile onnx2trt代码报错: import numpy as np import tensor
所以,我有允许两个输入的代码: a, b = input("Enter a command: ").split() if(a == 'hello'): print("Hi") elif(a =
我有一个与用户交流的程序。我正在使用 input() 从用户那里获取数据,但是,我想告诉用户,例如,如果用户输入脏话,我想打印 You are swearing!立即删除它! 而 用户正在输入。 如您
我在运行 J2ME 应用程序时遇到了一些严重的内存问题。 所以我建立了另一个步骤来清除巨大的输入字符串并处理它的数据并清除它。但直到我设置 input = null 而不是 input = "" 才解
我想在我的 android 虚拟设备中同时启用软输入和硬键盘。我知道如何两者兼得,但不会两者。 同时想要BOTH的原因: 软输入:预览当键盘缩小屏幕时布局如何调整大小 硬键盘:显然是快速输入。 提前致
我有一个邮政编码字段,在 keyup 上我执行了一个 ajax 调用。如果没有可用的邮政编码,那么我想添加类“input-invalid”。但问题是,在我单击输入字段的外部 某处之前,红色边框验证不会
根据我的理解使用 @Input() name: string; 并在组件装饰器中使用输入数组,如下所示 @Component({ ... inputs:
我有一段代码是这样的 @Component({ selector: 'control-messages', inputs: ['controlName: control'],
在@component中, @input 和@output 属性代表什么以及它们的用途是什么? 什么是指令,为什么我们必须把指令放在下面的结构中? directives:[CORE_DIRECTIVE
有没有一种方法可以测试变量是否会使SAS中的INPUT转换过程失败?或者,是否可以避免生成的“NOTE:无效参数”消息? data _null_; format test2 date9.; inp
我是一名优秀的程序员,十分优秀!