繁体   English   中英

使用 Dagger 注入接口的所有实现

[英]Inject all implementations of an interface using Dagger

我有一个接口BaseProcessor和它的几个实现。

现在,在 class ( ValidationComponent )中,我想列出我的所有 BaseProcessor 实现,如下所示: List<BaseProcessor> processors;

所有实现都有一个@Inject构造函数。

现在,目前我正在这样做:在ValidationComponent class 中,

    private List<BaseProcessor> processors;

    @Inject
    public ValidationComponent(@NonNull final ProcessorImpl1 processor1,
                               @NonNull final ProcessorImpl2 processor2,
                               @NonNull final ProcessorImpl3 processor3) {
        this.processors = new ArrayList<>();
        this.processors.add(processor1);
        this.processors.add(processor2);
        this.processors.add(processor3);
    }

为了将实现传递给构造函数,dagger 正在创建这些实现的实例,因为如前所述,它们都有@Inject构造函数。

现在,不是在构造函数中传递每个具体实现,我可以以某种方式使用 Dagger 为我创建所有这些实现实例吗?

我知道在 Spring 框架中可以通过使用@Component spring 注释来注释实现。 Dagger有办法吗?

您可以使用multibindings来完成此操作,特别是通过在抽象模块中添加@IntoSet绑定。

@Module
abstract class ProcessorBindingModule {

    @Binds
    @IntoSet
    abstract BaseProcessor bindProcessor1(ProcessorImpl1 processor);

    // ...

}

这使得Set<BaseProcessor>可用于注入:

    private List<BaseProcessor> processors;

    @Inject
    public ValidationComponent(@NonNull final Set<BaseProcessor> processors) {
        this.processors = new ArrayList<>(processors);
        // or just make the field a Set instead of a List
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM