Как описал Томас Бройер , у вас есть два отдельных направления: вы хотите, чтобы граф Кинжала знал, как добраться до вашего экземпляра приложения, и вы хотите получить доступ к определенным привязкам. графика зависимостей.
Строка @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)
... это то, что вы видите в демоверсии.