Dagger 2:如何注入Map <class <? extends =“”foo =“”>,提供者<! - ?扩展Foo - >&gt;

时间:2017-05-24 16:52:46

标签: java dependency-injection dagger-2

在Dagger 2中,是否可以注入Map<Class<? extends Foo>, Provider<? extends Foo>>

假设我有几个扩展Foo

的类
class Bar extends Foo {
    @Inject Bar() {}
}

class Baz extends Foo {
    @Inject Baz() {}
}

现在我想通过声明

来创建FooFactory
class FooFactory {
    @Inject FooFactory(Map<Class<? extends Foo>, Provider<? extends Foo>> providers) {}
}

我可以用最少的配置在Dagger 2中执行此操作吗?我已经阅读了Multibinding,但我无法让它发挥作用。

1 个答案:

答案 0 :(得分:6)

根据guidelines回答我自己的问题。

首先,你必须摆脱Provider<? extends Foo>中的通配符。

其次,您需要为地图密钥声明一个注释:

@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface FooKey {
    Class<? extends Foo> value();
}

然后,对于Foo的每个实施,您需要在Module中声明:

@Binds @IntoMap @FooKey(Bar.class)
abstract Foo bindBar(Bar bar)
相关问题