Dagger 2:模块中具有相同参数的嵌套依赖项
Dagger 2: nested dependencies with same arguments in Module
我有以下类
public class X {
@Inject
public X(B b){}
}
public class A {
@Inject
public A(B b){}
}
public class B {
@Inject
public B(String c){}
}
public abstract AppModule {
@Binds
abstract A bindA(A a);
@Binds
abstract B bindB(B a);
@Provide
static String stringForX(){
return "oneX";
}
@Provide
static String stringForA(){
return "twoA";
}
}
现在B被注入到A和X中了。但是要被注入到X和A中的B的实例必须在内部注入不同的字符串(分别是stringForX()和stringForA())
我怎样才能做到这一点?
我知道可以使用 @Named 但我不确定在这种特殊情况下具体如何使用,因为 B 在其中很常见。
谢谢
您必须在那些(B 的实例)上使用 @Named 从模块中手动提供 B 的 2 个实例。
示例:
public class X {
@Inject
public X(@Named("b1") B b){}
}
public class A {
@Inject
public A(@Named("b2") B b){}
}
public class B {
public B(String c){}
}
public abstract AppModule {
@Binds
abstract A bindA(A a);
@Binds
abstract B bindB(B a);
@Provides()
@Named("1")
static String stringForX() {
return "oneX";
}
@Provides
@Named("2")
static String stringForA() {
return "twoA";
}
@Provides
@Named("b1")
B provideB1(@Named("1") String s) {
return new B(s);
}
@Provides
@Named("b2")
B provideB2(@Named("2") String s) {
return new B(s);
}
}
我有以下类
public class X {
@Inject
public X(B b){}
}
public class A {
@Inject
public A(B b){}
}
public class B {
@Inject
public B(String c){}
}
public abstract AppModule {
@Binds
abstract A bindA(A a);
@Binds
abstract B bindB(B a);
@Provide
static String stringForX(){
return "oneX";
}
@Provide
static String stringForA(){
return "twoA";
}
}
现在B被注入到A和X中了。但是要被注入到X和A中的B的实例必须在内部注入不同的字符串(分别是stringForX()和stringForA()) 我怎样才能做到这一点? 我知道可以使用 @Named 但我不确定在这种特殊情况下具体如何使用,因为 B 在其中很常见。
谢谢
您必须在那些(B 的实例)上使用 @Named 从模块中手动提供 B 的 2 个实例。
示例:
public class X {
@Inject
public X(@Named("b1") B b){}
}
public class A {
@Inject
public A(@Named("b2") B b){}
}
public class B {
public B(String c){}
}
public abstract AppModule {
@Binds
abstract A bindA(A a);
@Binds
abstract B bindB(B a);
@Provides()
@Named("1")
static String stringForX() {
return "oneX";
}
@Provides
@Named("2")
static String stringForA() {
return "twoA";
}
@Provides
@Named("b1")
B provideB1(@Named("1") String s) {
return new B(s);
}
@Provides
@Named("b2")
B provideB2(@Named("2") String s) {
return new B(s);
}
}