几周前开始研究Dagger 2时,我遇到了与您相同的问题。我发现很难获得有关此信息(以及大多数其他与Dagger
2相关的问题)的信息,因此希望对您有所帮助!
最基本的答案是你不能。您正在寻找的是所谓的 辅助注入 ,它不是Dagger
2的一部分。其他一些依赖注入(DI)框架(例如Guice)确实提供了此功能,因此您可以进行研究。当然,仍有一些方法可以使用Dagger
2进行操作。
工厂工厂工厂
与DI结合使用的标准方法是使用Factory模式。基本上,您将创建一个可注入的工厂类,该类采用运行时参数,例如
address它提供的对象创建方法的参数。
在您的情况下,您需要在实例化时将
UtilFactoryDagger 2注入a
Validator并提供一种
create(Stringaddress)创建实例的方法
Util。
UtilFactory应该保留对的注入实例的引用,
Validator以便它具有
Util在
create方法中创建实例所需的一切。
许多此类工厂的接线代码可能很麻烦。您绝对应该看一下AutoFactory,它可以减轻一些负担。Guice的辅助注入似乎与Dagger
2 + AutoFactory非常相似(尽管使用了更好的语法糖)。
更多模块/组件
在这种情况下,我怀疑这是您要执行的操作,但是您 可以
仅创建一个提供地址的模块(并实例化一个新组件)。您不必为每个可能的地址创建一个新的@Module类。相反,您可以仅将地址作为参数传递给模块的构造函数。您可以使用teano建议的@
BindsInstance-annotation获得类似的结果。
我不确定这是否是反模式。在我看来,在某些情况下,这似乎是一条可以接受的路线,但是仅当您实际上使用相同的地址(例如,“许多”对象的初始化)时才可以。您绝对不希望为每个需要注入的对象实例化新组件
和 新模型。它效率不高,而且如果不注意,最终将获得比没有Dagger更高的样板代码。
请勿(始终)使用DI:可注射与可注射
一些了解DI框架时,这是对我来说非常有用是实现了使用DI框架并 不能 意味着你必须DI初始化 所有
的对象。作为经验法则:注入在编译时知道的并且与其他对象有静态关系的对象;不要注入运行时信息。
我认为这是关于该主题的好帖子。它介绍了“新产品”和“可注射产品”的概念。
- 注入 是DI图根附近的类。这些类的实例是您期望DI框架提供和注入的对象的类型。管理类型或服务类型的对象是注射剂的典型示例。
- 可更新 对象是位于DI图边缘的对象,或者甚至根本不属于DI图的一部分。
Integer
,Address
等是newables的例子。
从广义上讲,可再生能源是被动的对象,没有必要注入或嘲笑它们。它们通常包含应用程序中的“数据”,并且仅在运行时可用(例如,您的地址)。新产品不应保留对可注射产品的引用,反之亦然(该文章的作者将其称为“可注射/可分离新产品”)。
实际上,我发现在注射剂和新药之间进行明确区分并不总是容易或可能的。不过,我认为它们是很好的概念,可用于您的思考过程。在为项目添加另一个工厂之前,请三思而后行!
对于您的情况,我认为将其
Util视为可注射的内容并将地址作为可更新的内容是有意义的。这意味着该地址不应属于
Util该类。如果您想使用实例
Util作为例如validate
/ …地址,则只需将要验证的地址作为参数传递给validate / …方法。



