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

ksh*_*m07 3 java dependency-injection dagger dagger-2

我有一个接口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);
    }
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 5

您可以使用multibindings来实现这一点,特别是通过@IntoSet在抽象模块中添加绑定。

@Module
abstract class ProcessorBindingModule {

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

    // ...

}
Run Code Online (Sandbox Code Playgroud)

这使得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
    }
Run Code Online (Sandbox Code Playgroud)