Я создал компонент 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
}
Есть ли какой-нибудь чистый и хороший способ избежать объявления зависимостей здесь?