我有很多具有接口Foo
的对象。所以我有很多Foo
的提供者,没有问题。
我的问题是我有一个需要foo集合的对象(All the Foo)。请考虑以下事项:
@Module
@AppScope
public class AppModule {
//OTHER PROVIDERS MY FOO'S DEPEND ON OMITTED
@Provides
AaFoo provideAaFoo(){
return new AaFoo();
}
@Provides
BbFoo provideBbFoo(){
return new BbFoo();
}
@Provides
CcFoo providesCcFoo(Something something) {
return new CcFoo(something);
}
//EVEN MORE KINDS OF FOO's...
//Now I need to provide a thing that holds all Foo's
//TODO: This pattern is horribly ugly!
@Provides
FooManager provideFooManager(
AaFoo aa,
BbFoo bb,
CcFoo cc,
...) {//each time I make a foo I have to add; mention it here
FooManager fooService = new FooManager();
fooService.addFoo(aa);
fooService.addFoo(bb);
fooService.addFoo(cc);
fooService.addFoo(dd);
... //and I need to put it here, how nice it would be if this were a collection...
return fooService;
}
}
有没有办法我可以让匕首将所有foo聚合成一个集合,这样我就可以将该集合传递给我的provideRouteService
方法?那样,当我添加更多foo时,一切正常吗?
答案 0 :(得分:1)
啊,答案是在Multibindings(https://google.github.io/dagger//multibindings.html)中,非常简单:
简单地转换上述内容:
示例:
@Module
@AppScope
public class AppModule {
//OTHER PROVIDERS MY FOO'S DEPEND ON OMITTED
@Provides
@IntoSet
Foo provideAaFoo(){
return new AaFoo();
}
@Provides
@IntoSet
Foo provideBbFoo(){
return new BbFoo();
}
@Provides
@IntoSet
Foo providesCcFoo(Something something) {
return new CcFoo(something);
}
//EVEN MORE KINDS OF FOO's...
//Now I need to provide a thing that holds all Foo's
//TODO: This pattern isn't ugly any more!
@Provides
FooManager provideFooManager(
Set<Foo> foos) {
return new FooManager(foos);
}
}
还使用@Inject注释了FooManager的构造函数。更清楚了!