Ответ
@Module + @Provides или @Binds для предоставления зависимостей.
Для внедрения извне используй @Component.Builder или @Component.Factory:
@Component(modules = [MyModule::class])
interface MyComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance externalDep: ExternalDependency): MyComponent
}
}
// Использование:
val component = DaggerMyComponent.factory()
.create(ExternalDependencyImpl()) Ответ 18+ 🔞
А, ну это же классика, ёпта! Смотри, бывает такая ситуация, что твоя зависимость — как хуй с горы, её снаружи приносят, и Dagger про неё нихуя не знает. Например, какой-нибудь конфиг рантайма или клиент API, который ты собрал своими кривыми ручками.
Так вот, чтобы эту внешнюю хрень запихнуть в твой граф, нужно использовать @Component.Builder или @Component.Factory. Это как будто ты говоришь Dagger: «Слушай, дружок, вот эту штуку я тебе сам дам, а ты уж там внутри разберись, куда её пихать».
Смотри, как это выглядит. Берёшь свой компонент и делаешь ему фабрику:
@Component(modules = [MyModule::class])
interface MyComponent {
// Внимание на хуй! Вот эта самая фабрика
@Component.Factory
interface Factory {
// Помечаешь параметр @BindsInstance — это и есть наш внешний инжект
fun create(@BindsInstance externalDep: ExternalDependency): MyComponent
}
}
А потом используешь это дело, ядрёна вошь, просто и элегантно:
// Создаёшь свою внешнюю зависимость, хоть на коленке собранную
val myExternalThing = ExternalDependencyImpl()
// И говоришь Даггеру: на, мудила, собери мне всё, но с этой штукой внутри
val component = DaggerMyComponent.factory()
.create(myExternalThing)
И всё! Dagger возьмёт этот externalDep, засунет его в граф и будет инжектить куда попросят, будто он там всегда и был. Главное — не перепутай, это для внедрения извне, а не для тех зависимостей, которые ты можешь наколдовать внутри модуля с помощью @Provides. Если можешь создать объект внутри модуля — так и делай, не выёбывайся. А этот способ — именно для тех случаев, когда терпения ноль ебать и объект должен быть передан извне, иначе вся архитектура накрывается медным тазом.
Короче, @BindsInstance — это твой волшебный пинок под зад, чтобы протолкнуть в граф что угодно.