诀窍是Dagger通过组件强制实施范围/生命周期,您在这里创建了两个单独的组件:
ThingA thingA = DaggerThingAComponent.create().provideThingA();
ThingA thingB = DaggerThingAComponent.create().provideThingA();
每次创建新的顶级@Singleton注释组件时,Dagger都会为每个@Singleon对象创建一个全新的对象图,其中包含一个全新容器。您应该改为:
ThingAComponent component = DaggerThingAComponent.create();
ThingA thingA = component.provideThingA();
ThingA thingB = component.provideThingA();
当然,通过依赖关系图进一步访问的所有内容都来自同一个组件,因此这将保留您正在寻找的单例行为。
-
如果您需要某个东西的多个实例,您可以随时注入
Provider<T>
而不是
T
无论您是否创建了
@Provides
方法因此,您可以注入
Lazy<T>
如果您只需要特定依赖项的零个或一个副本,特别是如果该对象的创建特别繁重。
-
如果需要在对象图的深处注入组件本身,可以使用@Inject
@Inject Provider<T> tProvider
而不是
@Inject YourComponent
只是打个电话
YourComponent.getT
.
-
在某些情况下,包括Android,将组件保存到全局可访问的字段中可能是有意义的,可以作为应用程序中的实例字段,也可以作为其他地方的静态字段。这特别是因为Android自己创建对象,反射式地创建,而不是从图中获取注入的实例。对于所有其他情况,注入依赖项以避免需要传递组件。
另请参见:
Bindings in the graph
摘自《匕首2用户指南》