【问题标题】:How can I inject different instance with Dagger2如何使用 Dagger2 注入不同的实例
【发布时间】:2016-11-26 11:09:21
【问题描述】:

例如,让我们像下面这样说。

  • 有一个名为 MyActivity 的 Activity。
  • 有两个名为 A、B 的类,MyActivity 有这些类的实例。
  • 我想将一个名为 C 的类注入到 A 和 B 中。
  • C 具有遵循活动生命周期的范围。

在这种情况下,无论作用域如何,有没有办法用 Dagger 2 将 C 的不同实例传递给 A、B?

【问题讨论】:

标签: android dagger-2 dagger


【解决方案1】:

您需要使用qualifiers。来自dagger user's guide 的限定符部分:

有时仅靠类型不足以识别依赖关系。在 在这种情况下,我们添加一个限定符注解。

对于您的情况,仅仅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);
    }
}

【讨论】:

  • 是的,为什么我从来没想过这种方式?你是圣人。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多