如何使用 Dagger2 注入不同的实例
How can I inject different instance with Dagger2
例如,假设如下。
- 有一个名为 MyActivity 的 Activity。
- 有两个 class 名为 A、B 和 MyActivity 有这些 class 个实例。
- 我想将一个名为 C 的 class 注入到 A 和 B 中。
- C 的范围遵循 activity 生命周期。
在这种情况下,无论范围如何,是否有任何方法可以将 C 的不同实例传递给带有 Dagger 2 的 A、B?
你需要使用qualifiers. From the qualifiers section of the dagger user's guide:
Sometimes the type alone is insufficient to identify a dependency. In
this case, we add a qualifier annotation.
对于您的情况,仅 C
不足以识别您要注入 A
和 B
的两个不同依赖项。所以你会添加一个限定符来区分这两个实例。这是一个例子:
public class A {
private final C c;
@Inject
public A(@Named("Instance 1") C c) {
this.c = c;
}
}
public class B {
private final C c;
@Inject
public B(@Named("Instance 2") C c) {
this.c = c;
}
}
模块:
@Module
public class CModule() {
@Provides
@Named("Instance 1")
C provideInstance1OfC() {
return new C();
}
@Provides
@Named("Instance 2")
C provideInstance2OfC() {
return new C();
}
}
组件:
@Component( modules = { CModule.class } )
public interface ActivityComponent {
void inject(MyActivitiy activity);
}
然后最后:
public class MyActivity extends Activity {
@Inject A a;
@Inject B b;
@Override
void onCreate() {
super.onCreate();
DaggerActivityComponent.builder()
.cModule(new CModule())
.build()
.inject(this);
}
}
例如,假设如下。
- 有一个名为 MyActivity 的 Activity。
- 有两个 class 名为 A、B 和 MyActivity 有这些 class 个实例。
- 我想将一个名为 C 的 class 注入到 A 和 B 中。
- C 的范围遵循 activity 生命周期。
在这种情况下,无论范围如何,是否有任何方法可以将 C 的不同实例传递给带有 Dagger 2 的 A、B?
你需要使用qualifiers. From the qualifiers section of the dagger user's guide:
Sometimes the type alone is insufficient to identify a dependency. In this case, we add a qualifier annotation.
对于您的情况,仅 C
不足以识别您要注入 A
和 B
的两个不同依赖项。所以你会添加一个限定符来区分这两个实例。这是一个例子:
public class A {
private final C c;
@Inject
public A(@Named("Instance 1") C c) {
this.c = c;
}
}
public class B {
private final C c;
@Inject
public B(@Named("Instance 2") C c) {
this.c = c;
}
}
模块:
@Module
public class CModule() {
@Provides
@Named("Instance 1")
C provideInstance1OfC() {
return new C();
}
@Provides
@Named("Instance 2")
C provideInstance2OfC() {
return new C();
}
}
组件:
@Component( modules = { CModule.class } )
public interface ActivityComponent {
void inject(MyActivitiy activity);
}
然后最后:
public class MyActivity extends Activity {
@Inject A a;
@Inject B b;
@Override
void onCreate() {
super.onCreate();
DaggerActivityComponent.builder()
.cModule(new CModule())
.build()
.inject(this);
}
}