我通常对Dagger2和DI还是陌生的,但是我对用注入的键/值填充地图感兴趣。问题是,如果我提供确切的类型,它会起作用,我不能使其与通配符一起使用,对此有任何解决方案?
@Module
public class SimpleIssueModule
{
@Provides
@Singleton
@IntoMap
@StringKey("simple_issue")
public SimpleIssue provideSimpleIssue()
{
return new SimpleIssue();
}
}
@Module
public class DaggerFactoryModule
{
@Provides
@Singleton
public Factory provideFactory(Map<String, Provider< ? extends Issue>> map)
{
return new Factory(map);
}
}
答案 0 :(得分:3)
如果要映射Provider< ? extends Issue>> map
,则需要使用Issue
作为模块中返回的类型。 Dagger不会自行进行任何投射或猜测。
@Provides
@Singleton
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue() {
return new SimpleIssue();
}
在需要一个向Map提供基类(Issue)并且还需要具体类(SimpleIssue)的提供者的模块时该怎么办,我希望它是Singleton(两种情况下都返回相同的实例) )
在这种情况下,您提供了@Singleton
中的SimpleIssue
。
@Provides
@Singleton
public SimpleIssue provideSimpleIssue() {
return new SimpleIssue();
}
// or you can use constructor injection, dropping the method above...
@Singleton
public class SimpleIssue {
@Inject
public SimpleIssue(...) {
}
}
然后将这个实例绑定到Map中。不需要范围,因为实现应该声明它(如上所述)。
@Provides
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue(SimpleIssue issue) {
return issue;
}
// or alternatively with `@Binds` when using an abstract class / interface
// this leads to actually better performing dagger code
@Binds
@IntoMap
@StringKey("simple_issue")
public Issue provideSimpleIssue(SimpleIssue issue);