匕首2:在模块

时间:2018-07-19 04:58:57

标签: android dependency-injection dagger-2 dagger named-scope

我有以下课程

    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实例必须在内部注入不同的Strings(分别为stringForX()和stringForA()) 我怎样才能做到这一点? 我知道可以使用@Named,但是由于B在它们之间是常见的,因此我不确定在这种情况下的精确程度。

谢谢

1 个答案:

答案 0 :(得分:0)

您必须在模块(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);
}

}