在Dagger 2中使用@Binds和@Named

时间:2018-04-10 02:44:16

标签: android dagger-2 dagger

我的模块如下所示,

@Module
public abstract class BindsModuleEx {

    @Binds
    @Named("obj2")
    public abstract SomeInterface provideSomeInterface2(SomeInterfaceImpl2 someInterfaceImpl);

    @Binds
    @Named("obj1")
    public abstract SomeInterface provideSomeInterface1(SomeInterfaceImpl1 someInterfaceImpl);
}

我的SomeInterface实现如下所示

public class SomeInterfaceImpl1 implements SomeInterface {
  @Inject
  @Named("obj1")
  public SomeInterfaceImpl1() {
  }
public class SomeInterfaceImpl2 implements SomeInterface {

  @Inject
  @Named("obj2")
  public SomeInterfaceImpl2() {
  }

我可以在@Named方法上使用@Qualifier@Binds吗? 我知道将@Provides@Named一起使用,但我想知道为什么这不起作用,并且找到解决此类情况的正确方法。

错误消息如下所示

error: @Qualifier annotations are not allowed on @Inject constructors.

〜先谢谢。

2 个答案:

答案 0 :(得分:1)

@Named限定符不会继续构造函数声明 - 您需要在注入目标上使用它,例如如果您在活动中注入“obj1”,那么您将使用限定符。

答案 1 :(得分:0)

这就是我修改它的方式,并且有效。

public class MainActivity extends BaseActivity {

    @Inject
    @Named("obj1")
    SomeInterface someInterface1;

    @Inject
    @Named("obj2")
    SomeInterface someInterface2;
}

这就是我SomeInterface的实现现在

的方式
public class SomeInterfaceImpl1 implements SomeInterface {
  @Inject
  public SomeInterfaceImpl1() {
  }