2016-11-14 2 views
2

Так что я использую Dagger 2 для приложения для Android, но позвольте мне попытаться объяснить мою проблему без терминологии Android.Кинжал 2 Один контроллер, в зависимости от двух компонентов с областью

Просто у меня есть один контроллер, который показывает интерфейс. Чтобы показать соответствующие значения с соответствующими единицами, этот контроллер должен зависеть от двух компонентов с областью, что невозможно.

Вот случай: у меня есть

  • Один контроллер компонент, область действия с @Activity
  • One Application Comonent, область действия с @Singleton
  • Один DbComponent - компонент базы данных, область действия с @Application и зависит от ApplicationComponent.
  • One PreferencesComponent - снова компонент, в котором используется @Application и зависит от ApplicationComponent.

ControllerComponent должно зависеть как DbComponent, так что мой контроллер может получить данные, которые будут показаны, а на PreferencesComponent, чтобы показать соответствующие единицы (по Цельсию, по Фаренгейту, м/с, км/ч и т.д).

Что было бы лучшим способом реализовать мой график?

Я видел вопросы, похожие на мои, но они не помогли - question 1, question 2

+1

Большинство из этих "компонентов" должны быть модулями. Вот почему он не работает. Подробнее: http://stackoverflow.com/questions/40545075/dagger2-and-android/40546157#40546157 – EpicPandaForce

+0

Вы говорите мне, чтобы следовать какой-то схеме «Один компонент за область» или что-то еще? Я думаю, что вопрос частично философский. Почему (например) DbComponent должен быть только модулем, в то время как что-то вроде сетевого компонента должно быть в отдельном comonent вместо простого модуля? – definera

+0

Сетевой компонент также является одноточечным, не так ли? Тогда он должен быть модулем, частью одноэлементного компонента.Если вы видите этот ответ, «NetworkingComponent» был просто обычным «публичным интерфейсом» с использованием методов предоставления в нем, а не фактического компонента. – EpicPandaForce

ответ

3

Один контроллер компонент, область действия с @Activity

One Application Comonent, область действия с @Singleton

Один компонент DbComponent - компонент базы данных, в котором используется приложение @Application и зависит от ApplicationComponent.

One PreferencesComponent - снова компонент, в котором используется @Application и зависит от ApplicationComponent.

В действительности, a component should exist per scope.

Таким образом, вы должны иметь 2 компоненты:

1.) ApplicationComponent, отмеченные @Singleton

@Singleton 
@Component(modules={DbModule.class, PreferencesModule.class, AppModule.class}) 
public interface ApplicationComponent { 
    // provision methods 
} 

2.) ControllerComponent, отмеченные @Activity

@Activity 
@Component(dependencies={ApplicationComponent.class}, modules={ControllerModule.class}) 
public interface ControllerComponent extends ApplicationComponent { 
    // provision methods 
} 
Смежные вопросы