Scope просто сообщает Dagger сохранить экземпляр аннотированного областью объекта , а не создавать новый. Кинжал сохранит экземпляр в компоненте соответствующей области видимости. (Вам также следует знать, что код @ContributesAndroidInjector
создает для вас экземпляр подкомпонента, поэтому, если вы аннотируете метод @ContributesAndroidInjector
аннотацией области действия, сгенерированный подкомпонент примет эту область.)
В вашем примере SecretKey не ограничен; каждый раз, когда вы просите Dagger ввести SecretKey, он будет вызывать ваш конструктор и создавать новый экземпляр. Это, вероятно, хорошо, поскольку SecretKey, похоже, не поддерживает состояние, а сохранение экземпляра scopeless позволяет сборщику мусора собирать SecretKey, когда он вам больше не нужен.
Однако представьте, что вы создаете свой собственный объект Cache и хотите, чтобы этот Cache жил до тех пор, пока активность, но не дольше : каждый новый экземпляр Activity должен иметь свой собственный Cache. В отличие от SecretKey, вы не можете создавать свой собственный кэш каждый раз, когда его запрашиваете; вам нужно сохранить свой экземпляр кэша где-нибудь. Вы можете сделать это в качестве поля в самой Activity или создать экземпляр Module, который сохраняет значение экземпляра при первом вызове метода @Provides
, но Dagger предпочитает, чтобы вы пометили привязку аннотацией области действия, которая соответствует компоненту. Это позволяет вам объявить и задокументировать, что привязка будет иметь то же время жизни, что и компонент, и упростить классификацию привязок как «Область применения», «Область действия», «Область фрагмента», «Область обслуживания» и т. д.