匕首 2:如何注入 Map<Class<? 扩展 Foo>, 提供者<? 扩展 Foo>>



在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 中以最少的配置执行此操作吗?我已经阅读了有关多重绑定的信息,但我无法让它工作。

根据指南回答我自己的问题。


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

其次,您需要为 map 键声明一个注释:

@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)

最新更新