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

8

我有一个名为BaseProcessor的接口,以及几个实现类。

现在,在一个类(ValidationComponent)中,我想要拥有一个所有BaseProcessor实现类的列表,像这样: List<BaseProcessor> processors;

所有的实现类都有一个注解为@Inject的构造函数。

现在,目前我正在做这件事:

ValidationComponent类中,

    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有没有办法?
1个回答

9
你可以使用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
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接