匕首2:如何注入Map <Class ,Provider >
在Dagger 2中,是否可以注入Map<Class, Provider>
Map<Class, Provider>
Map<Class, Provider>
?
假设,我有几个扩展Foo
的类
class Bar extends Foo { @Inject Bar() {} } class Baz extends Foo { @Inject Baz() {} }
现在我想通过声明来创建一个FooFactory
class FooFactory { @Inject FooFactory(Map<Class, Provider> providers) {} }
我能用最少的配置在Dagger 2中做到这一点吗? 我读过有关Multibinding但我无法使用它。
根据指南回答我自己的问题。
首先,你必须摆脱Provider extends Foo>
中的通配符Provider extends Foo>
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)