我有一个类a,它保存一个类B:
class A {
private final B b;
@Inject
A(B b) {
this.b = b;
}
}
interface B {}
class B1 implements B {}
class B2 implements B {}
class Client() {
@Inject
Client(@AhasB1 A aHasB1, @AhasB2 A aHasB2) { }
}
我想绑定两个不同的A,一个注释@AhasB1
,另一个注释@AhasB2
。我怎样才能正确地绑定它们?
下面是我使用PrivateModule
的方法。
public class MainModule extends AbstractModule {
@Override
protected void configure() {
install(new PrivateModule(){
@Override
protected void configure() {
bind(A.class).annotatedWith(AhasB1.class).to(A.class);
expose(A.class).annotatedWith(AhasB1.class);
bind(B.class).to(B1.class);
}
});
install(new PrivateModule(){
@Override
protected void configure() {
bind(A.class).annotatedWith(AhasB2.class).to(A.class);
expose(A.class).annotatedWith(AhasB2.class);
bind(B.class).to(B2.class);
}
});
}
不使用@Provides
方法,而是考虑一组Provider<A>
类型,可能嵌套在类型a中,授予您对私有域的访问权。或者使它成为包保护的tor,并将提供程序放在与它相同的包中。或者,当然,您可以将您的Module类型移动到与a相同的包中。
另一个选项是AssistedInject,它允许您指定一组方法,这些方法将根据名称或参数返回不同的实例(在您的情况下,可能是a的子类型)。我认为它可以访问私有构造函数。
最后一个想法:为什么不把构造函数留给A作为公共的,这样库的用户就可以手动注入依赖?如果这只用于内部使用,那么记录该函数也足够了。
我认为你正在寻找的解决方案是私有模块
- 你将需要PrivateModule的两个实例,B1和B2各一个
- 将B绑定到相应的具体类型
-
expose(A.class).annotatedWith(B1.class)
dg