Почему компоненты Dagger должны декларировать свою сферу применения? - PullRequest
4 голосов
/ 31 марта 2019

Почему я должен аннотировать компонент Dagger областями, которые он собирается использовать? Почему недостаточно комментировать сам класс?

Ответы [ 2 ]

3 голосов
/ 31 марта 2019

Потому что сами по себе области ничего не значат. Именно компоненты и их взаимосвязь привносят смысл в сферы.

Объекты с незаданной областью могут быть предоставлены из любого компонента, если доступны их зависимости. Поскольку они не имеют области видимости, каждый раз, когда вы вызываете их провайдера, создается новый объект. Объект с областью действия будет совместно использовать жизненный цикл компонента той же области, и он будет создаваться только один раз для компонента. Если вы воссоздаете компонент, вы воссоздаете все объекты в его области видимости. Вот где все станет сложнее.

Скажем, у вас есть следующие настройки: компонент и подкомпонент, как это часто бывает.

@Component interface MyComponent {}

@Subcomponent interface MySubComponent {}

Теперь предположим, что у нас есть два класса: Foo в @FooScope и Bar в @BarScope. Оба поддерживают внедрение конструктора, и оба имеют аннотацию области действия для своего соответствующего класса. Допустим, мы добавляем метод обеспечения двух к нашему подкомпоненту:

@Subcomponent
interface MySubComponent {

  Foo getFoo();

  Bar getBar();
}

Теперь главный вопрос: Где создаются Foo или Bar и какой жизненный цикл компонента они разделяют?

Мы знаем, что Foo и Bar находятся в разных сферах, но это все. Если одно зависит от другого, мы можем быть в состоянии сделать вывод, что один находится в (родительском) компоненте, а другой - в подкомпоненте, поскольку каждый может зависеть только от объектов той же или более высокой области видимости, но это будет работать только для этой простой установки и оставит нас с неопределенностью снова, если мы когда-нибудь решим добавить третий компонент к этой установке.

Что произойдет, если у нас будет 3 области действия, но только два компонента? Какой из двух компонентов должен содержать две области (если это имеет смысл)? Или, если бы сообщать об ошибке, какая область является "неправильной"? Там просто не было бы возможности узнать наверняка.

Эти проблемы исчезнут, если вы также добавите область действия к компоненту. Теперь будет понятно, какой компонент обрабатывает какие объекты (области), и достаточно просто сообщать об ошибках, когда вводятся неизвестные области.

0 голосов
/ 31 марта 2019

Нам нужна локализация, потому что мы не хотим, чтобы все наши зависимости жили так долго, как приложение, и бывают случаи, когда мы хотим, чтобы наши зависимости не разделяли одно и то же состояние, будучи одним и тем же объектом.У действий есть свои собственные Presenters или ViewModels, 1 или более Presenters или ViewModels могут требовать одного Interactor, и Interactors зависит от уровня данных.Dagger 2 предоставляет @Scope в качестве механизма обработки видимости.Область видимости позволяет сохранить экземпляр объекта и предоставить его в качестве локального синглтона на время действия компонента области.Scopes заботится о сохранении одного экземпляра класса, пока существует его область действия.На практике это означает, что экземпляры, находящиеся в области действия @ApplicationScope, живут так же долго, как и объект Application.@ActivityScope хранит ссылки до тех пор, пока существует Activity (например, мы можем совместно использовать один экземпляр любого класса между всеми фрагментами, размещенными в этой Activity).Короче говоря, прицелы дают нам «местные синглтоны», которые живут столько же, сколько сам прицел.

...