Dagger2将相同基类型的提供者聚合到Array或Collection中?

时间:2017-07-22 20:05:01

标签: dagger-2

我有很多具有接口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时,一切正常吗?

1 个答案:

答案 0 :(得分:1)

啊,答案是在Multibindings(https://google.github.io/dagger//multibindings.html)中,非常简单:

简单地转换上述内容:

  1. 将@IntoSet添加到我的每个Foo提供商。
  2. 让他们都返回Foo而不是子类型
  3. 让FooProvider采用Set
  4. 示例:

    @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的构造函数。更清楚了!