Dagger 2:如何注入Map<Class<? extends Foo>, Provider<?扩展 Foo>>
Dagger 2: How to inject Map<Class<? extends Foo>, Provider<? extends 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 中以最少的配置执行此操作吗?我读过 Multibinding 但我无法让它工作。
根据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)
在 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 但我无法让它工作。
根据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)