2017-07-22 14 views
1

我有很多对象是接口Foo。所以我有很多Foo的供应商,没有问题。Dagger2聚集到阵列或集合中的相同基本类型的提供者?

我的问题是我有一个对象需要foo的集合(所有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

这将是很好,如果provideFooManager可以使用可变参数和匕首2可以以某种方式与... ... – Quaternion

回答

1

啊,答案是Multibindings(https://google.github.io/dagger//multibindings.html),是很简单的:

要转换只是上面:

  1. 添加@IntoSet和每一个富提供商。
  2. 让他们都返回Foo的替代亚型
  3. 有FooProvider采取集

例子:

@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); 
    } 
} 

而且注释FooManager与@Inject构造函数。更清楚!

相关问题