匕首2:如何注入Map< Class<?延伸Foo>,提供商<?扩展Foo>> [英] Dagger 2: How to inject Map<Class<? extends Foo>, Provider<? extends Foo>>

查看:152
本文介绍了匕首2:如何注入Map< Class<?延伸Foo>,提供商<?扩展Foo>>的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Dagger 2中,是否可以注入 Map< Class<?延伸Foo>,提供商<?扩展Foo>>

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

假设我有几个类扩展 Foo

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

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

现在我想通过声明

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

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

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

推荐答案

根据指南

首先,你必须摆脱提供商中的通配符<?扩展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();
}

然后,每次执行 Foo 您需要在模块中声明

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

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

这篇关于匕首2:如何注入Map&lt; Class&lt;?延伸Foo&gt;,提供商&lt;?扩展Foo&gt;&gt;的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆