Зачем дважды вводить приложение Android в Dagger? - PullRequest
0 голосов
/ 30 августа 2018

Глядя на исходный код для образца компонентов архитектуры Android GithubBrowerSample , я не понимаю смысла двойного введения githubApp.

Разве метода inject не будет достаточно? Зачем им оба в одном предложении?

public interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance Builder application(Application application);
        AppComponent build();
    }
    void inject(GithubApp githubApp);
}

И они используют это как:

public static void init(GithubApp githubApp) {
        DaggerAppComponent.builder().application(githubApp)
                .build().inject(githubApp);

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Как описал Томас Бройер , у вас есть два отдельных направления: вы хотите, чтобы граф Кинжала знал, как добраться до вашего экземпляра приложения, и вы хотите получить доступ к определенным привязкам. графика зависимостей.

Строка @BindsInstance в Builder создает привязку для Application, установленную для экземпляра, который вы передаете. Похоже, вы понимаете эту часть.

Однако, после того, как вы создали свой Компонент, вероятно, вы хотите использовать его. Допустим, вы хотите получить полностью внедренные экземпляры классов Dep1, Dep2 и Dep3 из вашего графика. Один из способов сделать это - создать в компоненте методы, которые получают экземпляры:

@Singleton @Component(/* ... */) interface AppComponent {
    // [builder snipped out here]

    fun getDep1(): Dep1
    fun getDep2(): Dep2
    fun getDep3(): Dep3
}

И затем вы называете их частью создания вашего приложения.

var appComponent = DaggerAppComponent.builder().application(githubApp).build()
var dep1 = appComponent.getDep1()
var dep2 = appComponent.getDep2()
var dep3 = appComponent.getDep3()
// Use dep1, dep2, and dep3 here.

Однако вы также можете создать метод с одним аргументом, который обычно является void методом с именем inject. Это заполняет все @Inject -аннотированные поля и вызывает все @Inject -аннотированные методы в передаваемом вами экземпляре. Если GitHubApp имеет @Inject -аннотированные поля ( и ) вызов inject позволяет пропустить определение всех методов получения в Компоненте. Это уменьшает весь приведенный выше код до:

DaggerAppComponent.builder().application(githubApp)
    .build().inject(githubApp)

... это то, что вы видите в демоверсии.

0 голосов
/ 30 августа 2018

@BindsInstance сообщает Dagger, что оно должно внедрить приложение в любое значение @Inject Application, найденное на графике зависимостей.

Второй просит Dagger ввести зависимости в @Inject -аннотированные поля и методы. Это корень графа зависимостей.

Технически, метод компонента может вызываться столько раз, сколько вам нужно, в то время как метод построителя может вызываться только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...