Дочерний компонент Dagger 2 для фабрики устанавливает зависимость - PullRequest
0 голосов
/ 16 февраля 2019

Я создал компонент Dagger 2, который знает, как создать множество реализаций фабрик.Это выглядит так:

@Component(modules = {DeviceModule.class})
public interface DeviceComponent {
Set<DeviceFactory> deviceFactories();
}

@Module
public interface DeviceModule {

    @IntoSet
    @Binds
    DeviceFactory provideSmartFactory(SmartFactory impl);

    @IntoSet
    @Binds
    DeviceFactory provideStupidFactory(StupidFactory impl);
}

Теперь я хочу использовать свои фабрики для создания соответствующих объектов, и я делаю это следующим образом в классе картографа:

private DeviceComponent deviceFactoryComponent =
            DaggerDeviceComponent.create();

 public DeviceModel map(Device pojo) {
        for (DeviceFactory deviceFactory : deviceFactoryComponent.deviceFactories()) {
            final DeviceModel result = deviceFactory.map(pojo);
            if (null != result) {
                return result;
            }
        }
        return null;
    }

Этот код работает, deviceFactoryComponent.deviceFactories () возвращает 2 реализации фабрики, как и ожидалось.Проблема в том, что в некоторых реализациях фабрик мне нужны некоторые зависимости, которые предоставляются из моего графика кинжала MainModule / MainComponent, например, Context.Отметим здесь, что я хочу создать около 20 фабрик с различными зависимостями от основного графа, и я хотел бы избежать предоставления реальной реализации DeviceModule с превращением DeviceComponent в подкомпонент.Также, если я предоставлю MainComponent в качестве зависимости, мне нужно будет объявить все мои необходимые зависимости в моем MainComponent, такие как:

@Singleton
@Component(modules = {
        MainModule.class,
})
public interface MainComponent extends AndroidInjector<MyApplication> {
Context getContext();
MyManager getManager();
//..etc
    }

Есть ли какой-нибудь чистый и хороший способ избежать объявления зависимостей здесь?

...