我有两个接口A和B,B正在扩展A.
我有一个提供程序能够提供其Class正在实现B(以及A)的实例。
我想将Provider绑定到B.class(直接),并在单例范围内使用Annotation绑定到A.class。
bind(B.class).toProvider(MyBImplProvider.class).in(Scopes.SINGLETON);
bind(A.class).annotatedWith(Names.named("B")).toProvider(MyBImplProvider.class).in(Scopes.SINGLETON);
如果我通过B.class或通过A.class + Annotation注入,如何从提供者返回相同的实例。例如,我希望能够将构造定义为
@Inject
C(B param)
或
@Inject
C(@Named("B") param)
在这两种情况下,我都希望用相同的单身人士来评估param。
答案 0 :(得分:3)
如何让您的A提供商依赖于您在上面定义的B提供商?
@Provides
@Named("B")
A provideA(Provider<B> bProvider) {
return bProvider.get();
}
这应该有效,因为你说B扩展了A.你可能需要使用@Named
位。
另一种选择是使用toInstance(yourObject)
绑定。但这会使任何依赖项注入该对象变得混乱。您必须使用Binder#requestInjection()
。