Внедрить все реализации интерфейса с помощью Dagger - PullRequest
0 голосов
/ 26 мая 2020

У меня есть интерфейс 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 Ответ

1 голос
/ 26 мая 2020

Вы можете выполнить sh это с помощью мульти-привязок , в частности, добавив привязку @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
    }
...