如何使用 Dagger2 注入不同的实例

How can I inject different instance with Dagger2

例如,假设如下。

在这种情况下,无论范围如何,是否有任何方法可以将 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 不足以识别您要注入 AB 的两个不同依赖项。所以你会添加一个限定符来区分这两个实例。这是一个例子:

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);
    }
}