Вопрос
Возможна ли древовидная структура субкомпонентов с фрагментными (@ContributesAndroidInjector) субкомпонентами с Dagger 2?Если да, то как можно отобразить сопоставленные Android-инжекторы на граф объектов (Dagger-android)?
Фон
Я пытаюсь создать древовидную структуру компонентовчтобы избежать необходимости передавать ссылки на объекты из класса в класс в моем приложении.Чтобы добиться этого, я попытался просмотреть документацию Подкомпонента Dagger 2, чтобы создать иерархию, но из-за запутанной / отсутствующей документации я не могу создать то, чего я пытаюсь достичь.
Я включаюмакет для продуманной архитектуры:
Application
|
| @ApplicationScope
| ApplicationComponent
---------------------------------------------------------------------------------------------
| |
@ActivityScope @ActivityScope
DiscussionsActivity ChatActivity
------------------------------------- ------------
| |
@FragmentScope @CategoryScope
DiscussionsCategoryListFragment CategoryComponent
------------------------------- -------------------------------------
| |
@FragmentScope @TopicScope
DiscussionsTopicListFragment TopicComponent
---------------------------- ---------------------------------------------
| |
@FragmentScope @FragmentScope
DiscussionsTopicDetailsFragment DiscussionsTopicCommentsFragment
Я также добавляю макет дизайна для тех, кому нужно визуальное представление для дизайна.
Макет дизайна
Код
public class MyApplication extends DaggerApplication {
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
return DaggerAppComponent
.builder()
.application(this)
.build();
}
}
@ApplicationScope
@Component(modules = {
ActivityBindingModule.class,
AndroidSupportInjectionModule.class,
})
public interface AppComponent extends AndroidInjector<MyApplication> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
@Module
public abstract class ActivityBindingModule {
@ContributesAndroidInjector(modules = {
DiscussionActivityModule.class,
DiscussionActivityFragmentBindingModule.class,
})
abstract DiscussionActivity contributesDiscussionActivity();
}
@Module(subcomponent = CategoryComponent.class)
public abstract class DiscussionActivityModule {
// How should I do to get the Fragments contributed in the
// CategoryComponent and its subcomponent included in the AndroidInjector factory?
}
@Module
public abstract class DiscussionActivityFragmentBindingModule {
@FragmentScope
@ContributesAndroidInjector(modules = DiscussionsCategoryListFragmentModule.class)
abstract DiscussionsCategoryListFragment contributesDiscussionsCategoryListFragment();
}
@CategoryScope
@Subcomponent(modules = {
CategoryFragmentBindingModule.class,
}
public interface CategoryComponent {
@Subcomponent.Builder
interface Builder {
Builder categoryModule(@Category long categoryId);
CategoryComponent build();
}
}
@Module
public abstract class CategoryFragmentBindingModule {
// How do I make this map entry available for the
// Map<Class<? extends Fragment>, AndroidInjector.Factory<? extends Fragment>> fragmentInjector factory?
@FragmentScope
@ContributesAndroidInjector(modules = DiscussionsTopicListFragmentModule.class)
abstract DiscussionsTopicListFragment contributesDiscussionsTopicListFragment();
}
Хорошо, так что я могу включить больше кода или объяснить, что там в настоящее время по запросу.
EDIT1: исправлена опечатка.