Dagger 2: How to inject Map<Class<? extends Foo>, Provider<? extends Foo>>

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-07 10:49:59

问题


In Dagger 2, is it possible to inject a Map<Class<? extends Foo>, Provider<? extends Foo>>?

Suppose, I have a couple of classes that extends Foo

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

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

and now I want to create a FooFactory by declaring

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

Can I do this in Dagger 2 with minimal configuration? I've read about Multibinding but I couldn't get it to work.


回答1:


Answering my own question in accordance to the guidelines.


First, you have to get rid of the wildcard in Provider<? extends Foo>.

Second, you need to declare an annotation for the map key:

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

Then, for each implementation of Foo you need to declare in your Module:

@Binds @IntoMap @FooKey(Bar.class)
abstract Foo bindBar(Bar bar)


来源:https://stackoverflow.com/questions/44164395/dagger-2-how-to-inject-mapclass-extends-foo-provider-extends-foo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!