Существует некоторая путаница в отношении роли компонентов и модулей в кинжале 2 в приложении для Android. Компоненты предназначены для группировки подобных жизненных циклов. Модули могут быть организованы по функциональным линиям и для тестирования (согласно official instructions for testing). Вот некоторые из лучших примеров этого: Google Android Architecture Blueprints Github repo. Если вы изучите исходный код, вы увидите, что есть один компонент с областью приложения (с жизненным циклом продолжительности всего приложения), а затем отдельные компоненты с областью действия для Activity и Fragment, соответствующие определенной функциональности в проект. Разумеется, компоненты с областью действия будут иметь жизненный цикл, соответствующий их соответствующей Деятельности.
Перейдем к вашему конкретному варианту использования. Хотя один из компонентов с областью действия, который может вводить все зависимости для действий А, В и С, может быть приемлемым для простого примера в вопросе, ситуация будет быстро усложняться, если изменения требований и активность А внезапно потребуют новой зависимости с сложный граф объектов. Затем вам нужно будет создать новый модуль для новой зависимости, который будет полезен только для одного из трех сайтов инъекций в вашем компоненте. Это, в свою очередь, усложнит тестирование, если вы используете макетный компонент для проверки активности B и активности C.
Следовательно, я бы сказал, что с самого начала лучше поддерживать один компонент для каждой деятельности. Компоненты, ориентированные на деятельность, дешевы и просты в обслуживании, поэтому не следует ошибаться с осторожностью и начинать с одного компонента, зависящего от активности, за активность.
Для примера вы указали, я бы создать приложение-компонент: область действия
@Component(modules = { SharedPreferencesModule.class })
@PerApp
interface AppComponent {
SharedPreferences sharedPreferences(Application app);
}
Вы можете иметь ваши компоненты Активности становятся зависимыми компонентами компоненты приложения. Таким образом, они не будут иметь дело с SharedPreferences
, так как это связано в приложение-компоненты и подвергаются воздействию иждивенцев:
@Component(dependencies = { AppComponent.class }, modules = { AdapterAModule.class })
@PerActivity
interface ActivityAComponent {
}
Как 'AdapterA',' AdapterB' и 'AdapterC' связанных? Все ли они одного типа? –
@DavidRawson: нет этих адаптеров не связаны – Tushar